#include <stdio.h>
#include <math.h>
int main()
{
char n[20];
int i, a[10], j, c;
for(j = 0; j < 10; j++) {
c = 0;
scanf("%s", n);
for(i = 0; n[i] != '\0'; i++) {
if(n[i]=='T' || n[i]=='D' || n[i]=='L' || n[i]=='F')
c++;
}
a[j] = pow(2, c);
}
for(i = 0; i < 10; i++)
printf("%d\n", a[i]);
return 0;
}
这段代码似乎在ubuntu gcc中运行正常但是当我在spoj上发布它时显示分段错误。我应该做些什么改变?
答案 0 :(得分:1)
一个问题(可能还有其他问题)是
scanf("%s",n);
不进行边界检查,
char n[20];
因此,如果被扫描的输入字符串超过19个字符(加上\0
终结符),可能导致分段错误(因为它是未定义的行为,它会&#39>,因此
会溢出;不能保证特别会发生任何事情。)
这就是为什么使用fgets
然后选择sscanf
代替scanf
通常更强大的原因之一,例如见this回答。