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

C 分段错误,我的代码中缺少什么?,c,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][

我正试图让我的代码将一个包含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;
}
int main(无效)
{
字符网格[30][30];

对于(int i=0;i这可能不包括您的所有错误,但我立即看到:

int xcoor,ycoor;
char symbol[2];
while((xcoor!=0)
你认为
xcoor
现在有一个有效值吗?应该吗?因为它没有。你已经创建了一个变量,然后在实际设置它之前,你要检查它的值

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


有关更多信息,请参见此处:

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

您可以通过初始化
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];
}
while(scanf(“%d%d%c%c”、&xcoor、&ycoor、&symbol[0]、&symbol[1])==4)
{
如果(xcoor<0 | | xcoor>=30)
{
//处理问题。
fprintf(stderr,“xcoor的超出或范围值:%d\n”,xcoor);
出口(1);
}
如果(ycoor<0 | | ycoor>=30)
{
//处理问题。
fprintf(stderr,“ycoor的超出或范围值:%d\n”,ycoor);
出口(1);
}
网格[xcoor-1][ycoor-1]=符号[1];
}

尝试使用调试器并查看代码失败的地方。顺便说一句:代码几乎无法读取。硬编码数字是成功的最佳方式:-)请添加验证
xcoor-1
ycoor-1
是否在
[0,30)
.1)
xcoor
未初始化。2)如果存在无效输入,则需要清除输入缓冲区(stdin)。