Позволяет разбить код на одну строку за раз (более или менее):
scanf("%d",&tc);
читает целое число в tc.
while(tc--)
loop tc times
scanf("%d",&n);
читает целое число в n
gets(str);
читает остальную часть строки в str
, удаляя завершающий символ новой строки
puts(str);
, печатает строку, после чего следуетновая строка
Итак, вы читаете целое число, а затем читаете столько целых + остальные пары строк и распечатываете строки (но не целые числа - они выбрасываются).Чтение целого числа включает пропуск любого пустого пространства (пробелов, табуляции и целых пустых строк) перед целым числом, но не после него, так что это может немного сбить с толку, в зависимости от того, какой ввод вы вводите в программу.
В вашем примере вы говорите, что вводите ему ввод:
3
4
anil kuma
2
abc
4
ams
Итак, давайте пройдемся по программе и посмотрим, что она делает:
- readцелое число
3
в tc - цикл 3 раза
- (первый цикл)
- чтение
4
в n - чтение остальной части строки(пусто) в
str
, - выведите пустую строку
- (второй цикл)
- попробуйте прочитать целое число в n, ноinput (
anil kuma
) не является целым числом, поэтому устанавливает флаг ошибки на stdin - для чтения остальной части строки (
anil kuma
) в str - print
anil kuma
- (третий цикл)
- читать
2
в n - читать остаток строки (пустой) в
str
- напечатать пустую строку
- цикл завершен, код завершения возврата 34.
Вы никогда не проверяете возвращаемое значение функций или код ошибки в stdin, поэтому тот факт, что вы получили ошибку, пытаетсячитать целое число на второй итерации совершенно невидимо.
Вы можете получить вывод, более похожий на ожидаемый, изменив ваши вызовы scanf на:
scanf("%d ", &n);
Обратите внимание на дополнительный пробел после% d преобразование, которое заставляет scanf считывать и выбрасывать пустое пространство, пока не найдет непробельный символ.Это заставит его выбросить символы новой строки после целых чисел, а также любые последующие пустые строки и любые пробелы / символы табуляции в начале следующей непустой строки