我的问题是,我希望通过用短语" Apples"替换它们来摆脱null。如果有人可以请看看我的代码并告诉我哪里出错了,我可以用什么修复来完成那个很棒的任务。
输入(文本文件):
A B C
E F G
I J K L
char *map[10][10];
int loadMap(char * filename){
FILE *fp;
int row = 0;
int col= 0;
char buffer[1000];
char phrase[100] = "pass";
fp = fopen(filename,"r");
if(fp == NULL){
perror(filename);
return(1);
}
char ch;
while (1) {
fscanf(fp, "%s", buffer);
map[row][col] = (char *)malloc(sizeof(char) * (strlen(buffer) + 1));
strcpy(map[row][col], buffer);
ch = fgetc(fp);
if (ch == ' ') {
col += 1;
}
else if (ch == '\n') {
row += 1;
col = 0;
}
else if (ch == EOF) {
break;
}
}
return(0);
}
void DisplayMap(int size){
int row, columns;
for (row=0; row<DUNGEONSIZE; row++)
{
for(columns=0; columns<DUNGEONSIZE; columns++)
printf("%s ", map[row][columns]);
printf("\n");
}
}
输出:
A B C (null) (null) (null) (null) (null) (null) (null)
E F G (null) (null) (null) (null) (null) (null) (null)
I J K L (null) (null) (null) (null) (null) (null)
L (null) (null) (null) (null) (null) (null) (null) (null) (null)
(null) (null) (null) (null) (null) (null) (null) (null) (null) (null)
(null) (null) (null) (null) (null) (null) (null) (null) (null) (null)
(null) (null) (null) (null) (null) (null) (null) (null) (null) (null)
(null) (null) (null) (null) (null) (null) (null) (null) (null) (null)
(null) (null) (null) (null) (null) (null) (null) (null) (null) (null)
(null) (null) (null) (null) (null) (null) (null) (null) (null) (null)
答案 0 :(得分:1)
看起来您的问题在于显示尺寸功能。它达到了数组(map)的大小。你没有得到的所有元素(由于切换行/行)都未被初始化,在这种情况下,它是NULL。
显示时,您要检查并确保它不是NULL。如果map被声明为全局变量,那么在显示之前检查它是否为空即可(例如if(map[x][y] == NULL...
)。如果不是,则必须填充数组,如下所示。
BTW:正如@kaylum所说,在显示功能中使用printf("%s ", map[row][columns] ? map[row][columns] : "Apples");
是必须有效的方法如果地图是全球。
现在,如果你想用苹果代替。在您的填充函数中,当您看到一个新行时,从该索引运行直到结束并填充apple。然后在找到文件结尾后,用apple填充一切左键:
while{...
else if (ch == '\n') {
while (col < 10){ //or col < sizeof(map[0])/sizeof(map[0][0])
col++
//malloc map here
strcpy(map[row][col], "Apple"); }
row += 1;
col = 0;
}...}
for (; row < 10; row++){
for(; col < 10; col++){
//malloc map[row][col] here
strcpy(map[row][col],"APPLE");}
col = 0;}
答案 1 :(得分:0)
fscanf读取直到空格或'\ n'。
首先,如何在文件中表示NULL。
当它达到NULL时,它将停止读取。现在,如果您将NULL表示为空格。你可以做fgetc,因为它读到'\ n'并继续你的逻辑。你可以声明
char * s = malloc(..) 的snprintf(S, “%S”, “苹果”)
并将char * [] []条目分配给s。
如果我理解错误,请告诉我。
while(1)
{
int num = fscanf(fp, "%s", buffer);
int ch;
if(!feof(fp) && num==0)
// meaning either end of file or not read (space/'\n')
{
while(!feof(fp) )
{
ch = fgetc(fp);
if(ch == '\n')
{
row += 1;
col = 0;
break;
}
else if(ch == ' ')
{
map[row][col] = strdup("Apple");
col += 1;
}
}
if(ch == '\n')
continue;
}
if(feof(fp))
break;
map[row][col] = (char *)malloc(sizeof(char) * (strlen(buffer) + 1));
strcpy(map[row][col], buffer);
}
在您的示例中,一旦NULL开始,就不会出现非null值。如果是,你可以使用倒带(fp)将指针向后移动1并继续使用fscanf。