我正在尝试将我的代码转换为包含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;
}
答案 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];
}