c中的扫描字符串
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.04c中的扫描字符串
允许在同一时间(或多或少)分解一行代码:
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
- 尝试读取的整数为n个,但输入(
- (三环路)
- 读
2
成n - 读取线(空白),其余为
str
- 打印空白行
- 读
- 循环完成,回退出码34.
你从来不检查重打开的功能或标准输入错误代码值,让你有想在第二次迭代读一个整数的错误其实是完全不可见。
你可能会得到一个输出更喜欢你正在改变你的scanf期待什么叫到:
scanf("%d ", &n);
注意:%d转换后的额外空间,从而导致scanf函数读取和扔掉whiltespace直到找到一个非空白字符。这将导致它扔掉整数后的换行符,以及任何后续的空行和任何空白/制表符在下一个非空行
得到它,在扫描期间%d之后需要空间n。 – 2011-12-26 21:20:34
请注意,%d之后的空格具有其他效果 - 即跳过空白行 - 您可能会也可能不会在意。 – 2011-12-27 02:10:40
在这里我得到我的机器上:
[email protected]:~/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.
[email protected]:~/tmp$ ./a.out
3
12qwe
qwe
34asd
asd
56zxc
zxc
如此看来,它会扫描。
看来你正在使用K & R C,但这不是个好主意。使用ANSI/ISO C标准。
- 有没有
#include <stdio>
,和程序的开始。需要使用scanf()
,gets()
和puts()
。使用可变参数函数时尤其必要,如printf
和scanf
(因此我的编译器会抱怨)。 - 您没有为main()声明参数类型。主要有原型
int main(int argc, char *argv[])
。 - 您使用函数参数作为局部变量,最好在函数体中声明它们。您必须在
{
之后有:int tc;
和int n;
。 - 从main()返回的可能值在
<stdlib.h>
中定义,可以是EXIT_SUCCESS
或EXIT_FAIL
或常用的0或1(当然,您可以使用其他值,但您必须确保它们在您的环境中有意义。
哦,看起来这只是因为代码太奇怪了。 – Vovanium 2011-12-26 21:16:41
我知道了,错误在行
scanf("%d", &n);
它需要%d
scanf("%d ", &n);
主要的声明后,空间不应该是这样的...你有什么要完成? – 2011-12-26 20:27:15
这是可怕的代码。你为什么要在'tc'(应该是'char **'类型)中做第一个'scanf'参数? – 2011-12-26 20:27:59
我们可以在main(), – 2011-12-26 20:28:41