2014-12-28 3 views
0

Я хочу прочитать весь текст, введенный до ввода нового символа строки.Сканирование до новой строки

Это мой код.

int i=0; 
char ch[MAX]; 
printf("Enter the text\n"); 
while(true) 
{ 
    scanf("%c",&ch[i]); 
    if(ch[i]=='\n') 
     break; 
    i++; 
} 

Но когда я пытаюсь выполнить его, он читает только одно слово.

Я также пробовал scanf("%s",ch);, но результат тот же.

+1

@almasshaikh Нет, 'gets()' should * never * рекомендуется. Это опасно. – unwind

+0

Хорошо @unwind Спасибо, что исправили меня. – SMA

+1

«Он читает только одно слово» -Нет. Ваш код делает то, что вам нужно. Или другим способом было бы использовать 'scanf ("% [^ \ n] ", ch); getchar();' –

ответ

3

Вы не проверяете, что scanf() преуспевает, прежде чем полагаться на ch[i], чтобы иметь действующее значение, это не очень хорошая идея.

Просто используйте fgets(), чтобы прочитать целую строку сразу.

+0

Спасибо Я просто гугл о fgets() символьных * fgets (символ * ул, Int N, FILE * поток) Каких должна быть аргументом * поток так, чтобы читать с клавиатуры –

+0

К сожалению людьми Но Scanf ("% [^ \ п]», ч); сделал работу –

+1

@AdityaKiran, в вашем случае вы можете использовать 'fgets (ch, MAX, stdin);' –

3

Передача комментария к ответу.

Ваш код будет работать. Код, который вы отправили, проверяет все, пока не будет найден символ новой строки (\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 в качестве примера.

+2

У вас нет нулевой строки; вы не проверяли длину буфера. –

+0

@ Джонатан Леффлер, да. Вы правы. Я отредактировал ответ. –

+0

Теперь я немного обеспокоен вашими комментариями о макросе MAX в строке формата. Если у вас есть '#define MAX 39' (для аргумента) и макросы' #define STRINGIZE (x) EVALUATE (x) 'и' #define EVALUATE (x) # x', и вы определяете 'char ch [MAX +1]; ', тогда вы можете использовать' scanf ("%" STRINGIZE (MAX) "[^ \ n]", ch) ', но MAX должен расширяться до простого числа, а не общего выражения. В противном случае я не вижу, как это можно заставить работать. –

0

ваш код работает нормально. Я проверил, он не читает ни слова.

+1

Код не имеет значения null для завершения строки или для предотвращения переполнения буфера. –

0

Я надеюсь, что это будет лучше для вас по отношению к вашему коду:

int main() 
{ 
    int i=0; 
    char ch[100]; 
    printf("Enter the text\n"); 
    gets(ch); // input text 
    puts(ch); // output text 
    return 0; 
} 

вход: asdf ghjkl zxcvb

выход: asdf ghjkl zxcvb

+3

НЕТ! Абсолютно никогда, _never_, ** никогда **, *** никогда не предлагайте использовать 'gets()'. Это ядовито ужасно. Он больше не является стандартом C и, возможно, (возможно, возможно) никогда не должен был быть - хотя, по его словам, были причины включить его в C89. См. [Почему функция 'gets()' опасна? Почему он не должен использоваться?] (Http://stackoverflow.com/questions/1694036/why-is-the-gets-function-dangerous-why-should-it-not-be-used) –

2

Как прокомментировал @ Джонатан Леффлера, код OP «s не завершает нуль строки или предотвращает переполнение буфера.

Поскольку код выбирает 1 char за раз, используйте намного проще fgetc().

int i=0; 
char ch[MAX]; 
int single; // Important that this in an int to distinguish EOF from input. 

printf("Enter the text\n"); 

while((single = fgetc(stdin)) != EOF) { 
    if (i >= (MAX-1)) { 
    ; // Too many, do not save or maybe indicate error 
    } else { 
    ch[i++] = single; 
    } 
    if (single == '\n') { 
    break; 
    } 
} 
ch[i] = '\0'; // Add termination 
Смежные вопросы