char* input;
scanf("%s",&input);
printf("%s\n",input);
Давайте возьмем его по строкам.
- Хорошо, поэтому
input
является char *
.
- Но мы читаем в него строку.
Таким образом, у нас достаточно места для указателя на символ, но затем мы пытаемся сохранить все количество символов. Поэтому, если вводится больше символов, чем число, используемое для хранения указателя на символ, мы сбой.
Если вы хотите сохранить строку, вам нужно выделить место для строки, как в втором примере, который не дает ошибки. Просто измените среднюю линию на scanf("%s",input);
. Вы хотите, чтобы input
распался на указатель на его содержимое.
Указатель в первом примере указывает на «нигде» (т. Е. Указывает на случайное местоположение). – usr2564301
@ Jongware Это нормально, он никогда не использует его содержимое. И его следующая строка кода заполняет ее. –
Собственно, ни один фрагмент не верен. Второй фрагмент передает '& input' в' scanf', когда он должен передавать 'input'. (Компилятор должен генерировать предупреждение об этом. Если нет, включите уровень предупреждения.) И спецификатор формата должен ограничивать количество символов (поскольку буфер невелик). Правильный спецификатор формата будет «% 19s». И код должен проверить возвращаемое значение из 'scanf'. Если 'scanf' терпит неудачу, тогда' input' будет неинициализирован, а 'printf' будет отображаться неопределенное поведение. Так что, как я вижу, у вас три ошибки в трех строках кода. – user3386109