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.04

4

3 回答 3

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

  1. 没有#include <stdio>, 和程序的开始。需要使用scanf(),gets()puts()。在使用可变参数函数时尤其必要,例如printfand scanf(因此我的编译器抱怨)。
  2. 您没有为 main() 声明参数类型。主要有原型int main(int argc, char *argv[])
  3. 您将函数参数用作局部变量,最好在函数体中声明它们。你必须有:int tc;并且int n;就在{.
  4. 从 main() 返回的可能值定义在<stdlib.h>并且可以是EXIT_SUCCESSEXIT_FAIL常用的 0 或 1(当然您可以使用其他值,但您必须确保它们在您的环境中是有意义的。
于 2011-12-26T20:49:00.787 回答
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
  • 循环 3 次
  • (第一个循环)
    • 4入 n
    • 将该行的其余部分(空白)读入str
    • 打印空行
  • (第二个循环)
    • 尝试将整数读入 n,但输入 ( anil kuma) 不是整数,因此在 stdin 上设置错误标志
    • 将 ( ) 行的其余部分读anil kuma入 str
    • 印刷anil kuma
  • (第三个循环)
    • 2入 n
    • 将该行的其余部分(空白)读入str
    • 打印空行
  • 循环完成,返回退出代码 34。

您永远不会检查函数的返回值或标准输入上的错误代码,因此您在第二次迭代中尝试读取整数时出错的事实是完全不可见的。

通过将 scanf 调用更改为:

scanf("%d ", &n);

请注意 %d 转换后的额外空间,这会导致 scanf 读取并丢弃空白字符,直到找到非空白字符。这将导致它丢弃整数之后的换行符,以及任何后续的空白行和下一个非空白行开头的任何空格/制表符

于 2011-12-26T20:59:48.980 回答
1

我明白了,错误在行

 scanf("%d", &n);

%d 后需要空间

 scanf("%d ", &n);
于 2011-12-26T21:23:00.653 回答