2011-12-26 118 views
0
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中的扫描字符串

+1

主要的声明后,空间不应该是这样的...你有什么要完成? – 2011-12-26 20:27:15

+1

这是可怕的代码。你为什么要在'tc'(应该是'char **'类型)中做第一个'scanf'参数? – 2011-12-26 20:27:59

+0

我们可以在main(), – 2011-12-26 20:28:41

回答

1

允许在同一时间(或多或少)分解一行代码:

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直到找到一个非空白字符。这将导致它扔掉整数后的换行符,以及任何后续的空行和任何空白/制表符在下一个非空行

+0

得到它,在扫描期间%d之后需要空间n。 – 2011-12-26 21:20:34

+1

请注意,%d之后的空格具有其他效果 - 即跳过空白行 - 您可能会也可能不会在意。 – 2011-12-27 02:10:40

3

在这里我得到我的机器上:

[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标准。

  1. 有没有#include <stdio>,和程序的开始。需要使用scanf(),gets()puts()。使用可变参数函数时尤其必要,如printfscanf(因此我的编译器会抱怨)。
  2. 您没有为main()声明参数类型。主要有原型int main(int argc, char *argv[])
  3. 您使用函数参数作为局部变量,最好在函数体中声明它们。您必须在{之后有:int tc;int n;
  4. 从main()返回的可能值在<stdlib.h>中定义,可以是EXIT_SUCCESSEXIT_FAIL或常用的0或1(当然,您可以使用其他值,但您必须确保它们在您的环境中有意义。
+0

哦,看起来这只是因为代码太奇怪了。 – Vovanium 2011-12-26 21:16:41

1

我知道了,错误在行

scanf("%d", &n); 

它需要%d

scanf("%d ", &n);