使用gets()进行C-Troubleshoot

时间:2012-04-13 06:13:31

标签: c

当我给出第一个输入时,在gets()工作之前会出现一个额外的0。但是,如果我删除gets(),那么就没有问题了。 printf()无法使用,因为它会在空白处中断。请提供任何替代解决方案或我该怎么做?

 #include <cstdio>
 #include <iostream>
 #include <stdlib.h>
 using namespace std;
 int main()
 {
  long long a,i,t,count;
  int op;
  char s[10000];
  scanf("%lld",&t);
  for(i=1;i<=t;i++)
  {
    gets(s);
    a=atoll(&s[7]);
    printf("%lld",a);
  }
  return 0;
 }

4 个答案:

答案 0 :(得分:3)

scanf()会在输入流中留下第一行的行尾字符,然后由 gets()使用。这是此处经常讨论的常见初学者错误。

建议:

  1. 请勿将 scanf()例程与 gets()例程混合使用。
  2. 除了短测试程序之外,不要使用 gets()(而是使用 fgets()),因为 gets()缓冲区溢出可能发生。

答案 1 :(得分:2)

您在使用scanf阅读时可以尝试添加'\ n'字符:

 scanf("%lld\n",&t);
  for(i=1;i<=t;i++)
  {
    gets(s);
    a=atoll(&s[7]);
    printf("%lld",a);
  }

答案 2 :(得分:2)

为什么不:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    long long i;
    long long t;
    char s[10000];

    if (fgets(s, sizeof(s), stdin) == 0)
        return 0;
    t = atoll(s);
    for (i = 1; i <= t; i++)
    {
        if (fgets(s, sizeof(s), stdin) == 0)
            break;
        a = atoll(&s[7]);
        printf("%lld\n", a);
    }
    return 0;
}

除了其他优点之外,它没有:

  • 打印迷路零,
  • 在一个据称是C程序中包含C ++代码,
  • 包含任何迷路(未使用)变量,
  • 使用危险的gets()功能。

公平地指出一些不足之处:

  • 如果数据行长度不超过8个字符,则会产生虚假输出;它应该在致电strlen(s)
  • 之前检查atoll(&s[7])
  • 我们假设10K比任何一行读取都要长,因此截断的行不会成为问题,尽管JSON数据有时似乎在没有任何换行符的文件中编码,并且可能长得很长(例如,Firefox书签列表或备份甚至不包含单个换行符。

答案 3 :(得分:1)

我确定你在这里要做什么,或者问题是什么。但是......

  1. 正如Greg Hewgill正确地说:永远不要使用“gets()”。这是一个等待发生的缓冲区溢出。

  2. 您可以使用“fgets()” - 它可以轻松解决问题。

  3. 当你在这里时,为什么选择“scanf()”,然后是“gets()”,然后是“atoll()”?这些输入中的任何一个都可以合并吗?或者更加一致?

  4. 你在哪里检查“atoll()”的有效转换?为什么不直接使用“sscanf()”(并检查返回值)?