2014-01-29 3 views
4

Я пишу этот код, который принимает целое число (t) в качестве ввода от пользователя. Цикл будет исполнен всего лишь «t» раз. Но я нахожу, что он работает за (t-1) раз. Например, если я даю вход 3, он работает только 2 раз. Может кто-нибудь объяснить, почему это происходит?Сколько раз этот цикл будет выполнен?

Я пробовал и использовал scanf("%s", &str), он работает, но тогда я не могу взять строку в качестве входных данных, которая содержит пробелы.

#include <stdio.h> 
int main() 
{ 
    int t; 
    scanf("%d", &t); 
    while(t--) 
     { 
     char str[100]; 
     gets(str); 
     printf("%s\n", str); 
     } 
    return 0; 
} 
+2

Никогда не используйте функцию 'gets'; он по своей сути небезопасен и удален из последней версии языка. «fgets» можно использовать безопасно, но немного сложнее. –

+0

Тело цикла работает 't' раз. – typ1232

ответ

2

scanf("%d", &t) потребляет только цифру во входном потоке и оставляет остальные символы. Когда вы вводите цифру и нажимаете клавишу ввода, после цифры появляется символ новой строки.

Первый gets читает эту новую строку и возвращает строку, которая пуста, за исключением новой строки. Первая итерация цикла печатает эту пустую строку.

1

петля итерация 3 раза, как это should.But кажется, что она итерация 2 раза только из-за той причине, что \n характер оставленным gets в буфере для чтения во второй итерации.
Для первой итерации, когда вы вводите строку и нажмите Введите, символ \n перейдите в буфер со строкой. gets прекратить чтение, когда он встречает \0, оставляя \n в буфере. На следующей итерации этот \n (непечатаемый символ) считывается gets, а затем печатается на терминал.


ПРИМЕЧАНИЕ: Никогда не используйте функцию gets. Он больше не является частью стандарта C. Вместо этого используйте fgets.

0

Я думаю, вы также можете использовать функцию scanf, чтобы решить вашу проблему, что строка ничего не принимает после SPACE. Кроме того, цикл работает (t-1) раз, потому что буфер не очищается из-за использования gets(). Чтобы решить эту проблему, вы можете использовать функцию getch() для очистки буфера. Следующий код должен работать я думаю,

#include <stdio.h> 
int main() 
{ 
    int t; 
    scanf("%d", &t); 
    while(t--) 
    { 
     char str[100]; 
     scanf("%[^\n]c",&str); 
     printf("%s\n", str); 
     getch(); 
    } 
return 0; 

}

В этом коде getch() очистит буфер, принимая бесполезное значение. Кроме того, что касается scanf(), то ^ внутри scanf сообщает функции, что ему необходимо принять ввод до символа после того, как встретится ^, который в этом случае является escape-последовательностью NEW LINE. Я попытался использовать некоторые небольшие слова, а не новую строку, и она тоже работала. Надеюсь, это очистит вашу проблему :)

Смежные вопросы