当我给出第一个输入时,在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;
}
答案 0 :(得分:3)
scanf()会在输入流中留下第一行的行尾字符,然后由 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;
}
除了其他优点之外,它没有:
gets()
功能。公平地指出一些不足之处:
strlen(s)
atoll(&s[7])
答案 3 :(得分:1)
我确定你在这里要做什么,或者问题是什么。但是......
正如Greg Hewgill正确地说:永远不要使用“gets()”。这是一个等待发生的缓冲区溢出。
您可以使用“fgets()” - 它可以轻松解决问题。
当你在这里时,为什么选择“scanf()”,然后是“gets()”,然后是“atoll()”?这些输入中的任何一个都可以合并吗?或者更加一致?
你在哪里检查“atoll()”的有效转换?为什么不直接使用“sscanf()”(并检查返回值)?