允许在同一时间(或多或少)分解一行代码:
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
- loop 3 times
- (first loop)
- 读取
4
成n
- 读取线(空白)到
str
的其余部分,
- 打印空白行
- (第二循环)
- 尝试读取的整数为n个,但输入(
anil kuma
)不是整数,所以设置错误标志在stdin
- 读取线(
anil kuma
)的其余部分成STR
- 打印
anil kuma
- (三环路)
- 读
2
成n
- 读取线(空白),其余为
str
- 打印空白行
- 循环完成,回退出码34.
你从来不检查重打开的功能或标准输入错误代码值,让你有想在第二次迭代读一个整数的错误其实是完全不可见。
你可能会得到一个输出更喜欢你正在改变你的scanf期待什么叫到:
scanf("%d ", &n);
注意:%d转换后的额外空间,从而导致scanf函数读取和扔掉whiltespace直到找到一个非空白字符。这将导致它扔掉整数后的换行符,以及任何后续的空行和任何空白/制表符在下一个非空行
主要的声明后,空间不应该是这样的...你有什么要完成? – 2011-12-26 20:27:15
这是可怕的代码。你为什么要在'tc'(应该是'char **'类型)中做第一个'scanf'参数? – 2011-12-26 20:27:59
我们可以在main(), – 2011-12-26 20:28:41