让我们一次分解一行代码(或多或少):
scanf("%d",&tc);
将一个整数读入 tc。
while(tc--)
循环 tc 次
scanf("%d",&n);
将整数读入 n
gets(str);
将该行的其余部分读入str
,删除尾随的换行符
puts(str);
打印出字符串,后跟换行符
因此,您正在读取一个整数,然后读取那么多整数+其余行对并打印出这些行(但不是整数-它们被丢弃了)。读取整数涉及跳过整数之前的所有空格(空格、制表符和整个空白行),但不跳过整数之后的任何空格,因此这可能会有些混乱,具体取决于您向程序提供的输入类型。
在您的示例中,您说您正在为其提供输入:
3
4
anil kuma
2
abc
4
ams
所以让我们来看看这个程序,看看它做了什么:
- 将整数读
3
入 tc
- 循环 3 次
- (第一个循环)
- 读
4
入 n
- 将该行的其余部分(空白)读入
str
,
- 打印空行
- (第二个循环)
- 尝试将整数读入 n,但输入 (
anil kuma
) 不是整数,因此在 stdin 上设置错误标志
- 将 ( ) 行的其余部分读
anil kuma
入 str
- 印刷
anil kuma
- (第三个循环)
- 读
2
入 n
- 将该行的其余部分(空白)读入
str
- 打印空行
- 循环完成,返回退出代码 34。
您永远不会检查函数的返回值或标准输入上的错误代码,因此您在第二次迭代中尝试读取整数时出错的事实是完全不可见的。
通过将 scanf 调用更改为:
scanf("%d ", &n);
请注意 %d 转换后的额外空间,这会导致 scanf 读取并丢弃空白字符,直到找到非空白字符。这将导致它丢弃整数之后的换行符,以及任何后续的空白行和下一个非空白行开头的任何空格/制表符