Замечать странное поведение со строками в c - PullRequest
1 голос
/ 01 октября 2011

Все еще в режиме обучения и может быть следующий вопрос действительно глуп, но я не имею ни малейшего представления, почему это происходит ..

#include<stdio.h>
int main()
    {
      /* code to accept string and then a character from stdin */
         char str[20], inp;
         /*take string from stdin */
         printf("string:\n");
         scanf("%s",str);
         fflush(stdin);
         /*input a character */
         printf("char:\n");
         scanf("%c",&inp);/* code does not reach this point and exits */

    }

Как уже упоминалось в комментарии, после ввода строки, например, для. 'strng' код просто выходит после печати char: но он не ждет, пока я введу символ. Насколько я понимаю, я дал размер массива, достаточно большой для хранения строки, и если введенная строка меньше размера массива str, компилятор автоматически добавит нулевой символ в конец строки и продолжит работу , Я что-то упустил или есть ошибка в моем коде. Пожалуйста, предложите.

Спасибо.

Ответы [ 3 ]

3 голосов
/ 01 октября 2011

Попробуйте удалить fflush(stdin); и поставить пробел перед% c в scanf(" %c",&inp);

2 голосов
/ 01 октября 2011

Прежде всего fflush(stdin) неверно .Многие люди рекомендуют его, но оно не определено.

Проблема вызвана тем, что scanf оставляет \n во входном буфере, поскольку "% s" не читает символы пробелов.Когда достигается scanf("%c"..), он сразу же «удовлетворяется», заполняет inp \n и называет его днем.

Проблема достаточно распространена, см. Следующие часто задаваемые вопросы по C:

Одно (возможно опасное) решение - отбросить \n ввод:

while((c = getchar()) != '\n' && c != EOF)
    ;

Другим решением может быть использование fgets и его синтаксический анализ, или, возможно, чтение по одному символу за раз с помощью getc, или, возможно, настройка второго мошенничества для удаления пробельных символов.

1 голос
/ 01 октября 2011

Поставьте пробел перед %c во втором scanf следующим образом:

scanf(" %c",&inp)

И, как указано другими, fflush определяется только для выходных потоков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...