用短语Apples替换矩阵中的所有null

时间:2016-06-28 04:13:31

标签: c matrix

我的问题是,我希望通过用短语" 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)

2 个答案:

答案 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。