-1

当我给出第一个输入时,工作前会出现一个额外的 0 gets()。但是,如果我删除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

4 回答 4

3

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

建议:

  1. 不要将scanf()例程与gets()例程混用。
  2. 除了简短的测试程序不要使用gets()(而是使用fgets()),因为使用gets()可能会发生缓冲区溢出。
于 2012-04-13T06:20:46.760 回答
2

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

 scanf("%lld\n",&t);
  for(i=1;i<=t;i++)
  {
    gets(s);
    a=atoll(&s[7]);
    printf("%lld",a);
  }
于 2012-04-13T06:55:27.127 回答
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 书签列表或备份,例如,甚至不包含一个换行符)。
于 2012-04-13T07:02:42.747 回答
1

我确定您在这里尝试做什么,或者问题是什么。但 ...

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

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

  3. 当您使用它时,为什么要使用“scanf()”,然后是“gets()”,然后是“atoll()”?可以合并这些输入中的任何一个吗?还是变得更加一致?

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

于 2012-04-13T06:20:59.280 回答