проблема с scanf на входе - PullRequest
       1

проблема с scanf на входе

0 голосов
/ 14 августа 2011

привет У меня проблемы с использованием scanf при последовательном чтении двух строк с пробелами

char name[50] = {0};
char address[100] = {0};
char name1[50] = {0};
char address1[100] = {0};
int size = 0;
//input = fopen("/dev/tty","r+");
//output = fopen("/dev/tty","w");
printf("\nenter the name:");
scanf("%[^\n]s",name);
//fgets(name,sizeof(name),input); // this works fine
printf("\nenter the address:");
scanf("%[^\n]s",address);
//fgets(address,sizeof(address),input); // this works fine

ввод для адреса вообще не берется .. может быть, он принимает клавишу возврата в качестве ввода?

Ответы [ 2 ]

2 голосов
/ 14 августа 2011

У вас есть пара проблем.

Как указал @sander, вы ничего не делаете для очистки новой строки из буфера ввода.

Вы также использовали %[^\n]s - но s не требуется (и не является частью) преобразования набора сканирования. Так как он не является частью преобразования, scanf пытается сопоставить этот символ на входе - но, поскольку вы только что прочитали до новой строки (и не прочитали саму новую строку), он более или менее требует, чтобы 's' = = '\ n' - что, очевидно, не может быть, поэтому сканирование не выполняется.

Чтобы сделать это, вы можете использовать что-то вроде этого:

scanf("%49[^\n]%*c", name);
scanf("%99[^\n]%*c", address);

Относительно того, почему вы хотите использовать это вместо fgets, одна очевидная причина состоит в том, что он не включает в себя завершающий (и редко желаемый) символ новой строки, когда все работает правильно. fgets Сохранение новой строки дает вам один результат, который может быть полезен: новая строка присутствует тогда и только тогда, когда все содержимое строки было прочитано. Если вы действительно обеспокоены этим (например, вы хотите изменить размер буфера и продолжить чтение, если имя превышает указанный размер), вы можете получить то же самое с scanf - вместо использования %*c для второго преобразования, используйте %c и передайте адрес char. Вы читаете всю строку в том и только в том случае, если впоследствии прочитали новую строку в этот символ.

2 голосов
/ 14 августа 2011

Символ новой строки ('\n') все еще остается во входном потоке после первого вызова scanf, поэтому второй вызов scanf сразу его видит и сразу прекращает чтение.

Я заметил, чтоВы упоминаете fgets в комментариях - почему бы не использовать это?Он делает то, что ты хочешь делать довольно хорошо.

...