SPOJ给出了分段错误

时间:2014-08-21 23:46:29

标签: c onlinejudge

 #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上发布它时显示分段错误。我应该做些什么改变?

1 个答案:

答案 0 :(得分:1)

一个问题(可能还有其他问题)是

scanf("%s",n);

不进行边界检查,

char n[20];
因此,如果被扫描的输入字符串超过19个字符(加上\0终结符),

可能导致分段错误(因为它是未定义的行为,它会&#39>,因此

会溢出;不能保证特别会发生任何事情。)

这就是为什么使用fgets然后选择sscanf代替scanf通常更强大的原因之一,例如见this回答。