Передача комментария к ответу.
Ваш код будет работать. Код, который вы отправили, проверяет все, пока не будет найден символ новой строки (\n
). Но, как прокомментировал Jonathan Leffler, вы никогда не NUL-прекратите свою строку. Для этого просто используйте
ch[i]='\0';
после петли. Кроме того, пользователь может ввести больше символов, чем MAX-1
(один дополнительный для \0
в конце), и это может вызвать buffer overflow. Вы должны добавить проверку как
if(i==MAX-1)
break;
непосредственно перед scanf
для того, чтобы предотвратить его от переполнения.
Обратите внимание, что scanf("%s",ch);
сканирует, пока не встретит пробел или символ новой строки.
Вместо зацикливания и сканирования посимвольно, просто используйте
scanf("%[^\n]",ch);
getchar();
выше scanf
сканирует все до символа новой строки не найден, и помещает их в ch
. Затем getchar()
отбрасывает \n
от stdin
. Вы также можете повысить безопасность, ограничив количество символов, которое scanf
читает в ch
.
scanf("%49[^\n]",ch);
выше scanf
будет сканировать максимум 49 символов и добавит \0
в конце. Вы можете заменить значение MAX-1
. Я использовал 50 в качестве примера.
@almasshaikh Нет, 'gets()' should * never * рекомендуется. Это опасно. – unwind
Хорошо @unwind Спасибо, что исправили меня. – SMA
«Он читает только одно слово» -Нет. Ваш код делает то, что вам нужно. Или другим способом было бы использовать 'scanf ("% [^ \ n] ", ch); getchar();' –