在c中扫描字符串

时间:2011-12-26 20:21:10

标签: c string input scanf gets

   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

3 个答案:

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

  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(当然您可以使用其他值,但是您有确保它们在您的环境中有意义。

答案 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
  • 循环3次
  • (第一圈)
    • 4读入n
    • 将剩下的行(空白)读入str
    • 打印空行
  • (第二圈)
    • 尝试将整数读入n,但输入(anil kuma)不是整数,因此在stdin上设置错误标志
    • 读取行的其余部分(anil kuma)到str
    • 打印anil kuma
  • (第三循环)
    • 2读入n
    • 将其余部分(空白)读入str
    • 打印空行
  • 循环完成,返回退出代码34。

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

通过将scanf调用更改为:

,您可能会得到更像您期望的输出
scanf("%d ", &n);

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

答案 2 :(得分:1)

我明白了,错误在行

 scanf("%d", &n);

%d之后需要空间

 scanf("%d ", &n);