Почему я не могу использовать% s вместо% c? - PullRequest
0 голосов
/ 02 мая 2018

Вся функция, о которой идет речь, состоит в том, чтобы дать двумерный массив, инициализированный с {0}, в качестве вывода и дать пользователю возможность перемещать 1 по полю с помощью

char wasd;
scanf("%c", &wasd);

(функция для перемещения путем изменения значения переменной wasd не важна, я думаю) теперь мой вопрос, почему использовать

scanf("%s", &wasd);

работает только частично (иногда 1 продолжает оставаться в поле и появляется 2 раза на новом месте, хотя на самом деле его следует удалить) и

scanf("%.1s", &wasd);

приводит к тому, что поле печатается без остановки до закрытия программы выполнения. Я решил использовать% .1s после исследования разницы между% c и% s здесь Почему в строке формата printf C есть и% c, и% s? ? Если кто-то может выяснить ответ, прочитав его, я не достаточно умен и недостаточно умен, чтобы научиться его получать. Я также обнаружил, что fscanf () в C - разница между% s и% c , но я ничего не знаю о EOF, в котором один ответ говорит о причине проблемы, поэтому я предпочел бы получить ответ без него , Спасибо за ответ

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Переменная char может содержать только один байт памяти для хранения одного символа. Но строка (массив символов) отличается от переменной char, поскольку она всегда заканчивается нулевым символом \0 или цифрой 0. Так, в scanf вы специально упомянули, читаете ли вы символ или строку, чтобы scanf мог добавить нулевой символ в конце строки. Таким образом, вы не должны использовать %s для чтения значения переменной char

0 голосов
/ 02 мая 2018

Просто, %s - это преобразование (непустой) строки. строка в C всегда заканчивается байтом 0, поэтому любая непустая строка должна содержать не менее двух байтов. Если вы передадите указатель на одну переменную char, scanf() просто перезапишет все, что находится в памяти, после этой переменной - вы вызовете неопределенное поведение , и может произойти все, что угодно.


Примечание: scanf("%s", ..), даже если вы дадите ему массив из char, он всегда будет переполнять буфер, если будет введено что-то более длинное, что приведет к неопределенному поведению . Вы должны включить ширину поля как

char str[10];
scanf("%9s", str);

Лучше не использовать scanf() вообще. Для ввода одного символа вы можете просто использовать getchar() (имейте в виду, что возвращается int). Вы также можете прочесть мое руководство для начинающих с сайта scanf .

...