int main( )
{
char str[200];
int n,tc;
scanf("%d",&tc);
while(tc--)
{
scanf("%d",&n);
gets(str);
puts(str);
}
return 34;
}
为什么此代码不扫描否。字符串(str)等于tc?
平台UBUNTU 10.04
答案 0 :(得分:3)
这是我在机器上的内容:
vovanium@microvovanium:~/tmp$ cc whoa.c
whoa.c: In function ‘main’:
whoa.c:4: warning: incompatible implicit declaration of built-in function ‘scanf’
/tmp/cc1r5dZe.o: In function `main':
whoa.c:(.text+0x4b): warning: the `gets' function is dangerous and should not be used.
vovanium@microvovanium:~/tmp$ ./a.out
3
12qwe
qwe
34asd
asd
56zxc
zxc
所以它似乎在扫描。
看来你正在使用K& R C,但这不是个好主意。使用ANSI / ISO C标准。
#include <stdio>
,也没有程序的开头。需要使用scanf()
,gets()
和puts()
。在使用变量参数函数时尤其必要,例如printf
和scanf
(因此我的编译器会抱怨)。int main(int argc, char *argv[])
。int tc;
之后有int n;
和{
。<stdlib.h>
中定义,可以是EXIT_SUCCESS
或EXIT_FAIL
或常用0或1(当然您可以使用其他值,但是您有确保它们在您的环境中有意义。答案 1 :(得分:1)
让我们一次分解一行代码(或多或少):
scanf("%d",&tc);
将整数读入tc。
while(tc--)
循环tc次
scanf("%d",&n);
将整数读入n
gets(str);
将该行的其余部分读入str
,删除尾部换行符
puts(str);
打印出字符串,后跟换行符
所以你正在读取一个整数,然后读取那么多整数+其余的行对并打印出行(但不是整数 - 它们会被抛弃)。读取整数包括在整数之前跳过任何空格(空格,制表符和整个空白行),但不能在整数之后跳过任何空格,因此这可能会有点混乱,具体取决于您为程序提供的输入类型。 / p>
在你的例子中,你说你正在输入输入:
3
4
anil kuma
2
abc
4
ams
让我们看一下程序,看看它的作用:
3
读入tc 4
读入n str
,anil kuma
)不是整数,因此在stdin上设置错误标志anil kuma
)到str anil kuma
2
读入n str
您永远不会检查函数的返回值或stdin上的错误代码,因此在第二次迭代中尝试读取整数时出错的事实是完全不可见的。
通过将scanf调用更改为:
,您可能会得到更像您期望的输出scanf("%d ", &n);
请注意%d转换后的额外空格,这会导致scanf读取并丢弃空格,直到找到非空白字符。这将导致它在整数之后丢弃换行符,以及下一个非空行开头的任何后面的空白行和任何空格/制表符
答案 2 :(得分:1)
我明白了,错误在行
scanf("%d", &n);
%d之后需要空间
scanf("%d ", &n);