分段错误,我的代码中缺少什么?

时间:2016-07-05 17:35:23

标签: c

我正在尝试将我的代码转换为包含3列xcoor,ycoor和带有2个字符的符号的文本文件到30x30地图中,该地图打印符号的第2个字符,其余空格被填充用'。'但是,我的代码似乎没有运行,当我尝试输入文本文件时出现分段错误,我做错了什么?提前致谢

int main(void)
{
   char grid[30][30];
   for(int i=0;i<30;i++){
      for(int j=0;j<30;j++){
         grid[i][j]='.';
      }
   }

   int xcoor,ycoor;
   char symbol[2];
   while((xcoor!=0)||(scanf("%d",&xcoor)))
   {
      while(xcoor==0){
         scanf("%d",&xcoor);
      }
      scanf("%d %c%c",&ycoor,&symbol[0],&symbol[1]);
      grid[xcoor-1][ycoor-1]=symbol[1];
   }

   for(int i=0;i<30;i++){
      for(int j=0;j<30;j++){
         printf("%c ",grid[i][j]);
      }
      printf("\n");
   }

   return 0;
}

2 个答案:

答案 0 :(得分:2)

这可能无法涵盖您的所有错误,但我立即看到了这一点:

int xcoor,ycoor;
char symbol[2];
while((xcoor!=0)

您认为xcoor目前是否具有有效价值?应该是?因为它没有。您已经创建了一个变量,然后在实际设置它之前,您正在检查它的值。

您的scanf电话很可能会给您带来麻烦。无论如何,尝试实际设置这些变量。它很可能会解决您的问题。

有关详细信息,请参阅此处:Is reading from unallocated memory safe?

答案 1 :(得分:0)

您在xcoor语句的条件下使用未初始化的变量while

您可以通过初始化xcoor来解决此问题。

更重要的是,您可以简化用于读取用户数据的代码和相关的错误检查。这是我的建议:

while ( scanf("%d%d %c%c", &xcoor, &ycoor, &symbol[0], &symbol[1]) == 4 )
{
   if ( xcoor < 0 || xcoor >= 30 )
   {
      // Deal with problem.
      fprintf(stderr, "Out or range value of xcoor: %d\n", xcoor);
      exit(1);
   }
   if ( ycoor < 0 || ycoor >= 30 )
   {
      // Deal with problem.
      fprintf(stderr, "Out or range value of ycoor: %d\n", ycoor);
      exit(1);
   }

   grid[xcoor-1][ycoor-1] = symbol[1];
}