2016-06-28 2 views
1

Мой вопрос в том, что я хотел бы избавиться от null, заменив их фразой «Яблоки». Если кто-то может взглянуть на мой код и сказать мне, где я ошибся, и какое решение я могу применить для выполнения этой задачи, было бы здорово.Замените все нули в матрице фразой Яблоки

ввода (текстовый файл):

A B C

Е Ж

Й К Л

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

Я предполагаю, что карта является 2-мерным массивом указателя на символ? – engineer14

+0

Да. char * map [10] [10]; –

+2

Пожалуйста, предоставьте [mcve]. Кроме того, что такое вход и откуда идет выход (ваш код, как показано, не имеет выхода)? И, наконец, найдите время, чтобы исправить код вашего кода, чтобы сделать его более читаемым. – kaylum

ответ

1

Похоже, ваша проблема заключается в вашей функции отображения. Он приближается к размеру массива (карта). Все элементы, которые вы не получили (из-за переключения строк/строк), остаются неинициализированными, в этом случае, которые являются NULL.

При отображении вы хотите проверить и убедиться, что это не NULL. Если карта была объявлена ​​как глобальная переменная, вы должны быть в порядке, проверяя ее значение null перед отображением (т.е. if(map[x][y] == NULL...). Если это не так, вам нужно будет заполнить массив, как показано ниже.

BTW: а @kaylum сказал, используя printf("%s ", map[row][columns] ? map[row][columns] : "Apples"); в функции отображения является обязательным эффективным методом , если карта является глобальной.

Теперь, если вы хотите использовать яблоки вместо этого. В вашей функции заполнения, когда вы видите новую строку, бегите от этого индекса до конца и заполняете яблоком. И после того, как вы найдете свой конец файла, заполните ВСЕ ВСЁ с яблоком:

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;} 
+0

Да, я вижу это, но есть ли способ сделать пустые пятна в массиве содержать пропущенную фразу? Вместо того, чтобы вручную отображать его и маскировать нуль. –

+0

Если вы не возражаете, вы можете показать мне «Теперь, если вы хотите использовать яблоки вместо этого. В вашей функции заполнения, когда вы видите новую строку, бегите от этого индекса до конца и заполняете яблоком« Я новичок в c, поэтому все это на самом деле путается на данный момент. –

+0

there you go @zero – engineer14

0

fscanf читает до любого пространства или '\ n'.

Прежде всего, как NULL представлен в файле.

Когда он достигнет NULL, он перестанет читать. Теперь, если вы представили NULL как пространство. Вы можете сделать fgetc, потому что он читает до «\ n» и продолжит вашу логику. Вы можете объявить

символ * S = таНос (..) snprintf (с, "% 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 запускаются, не возвращается ненулевое значение. Если это возможно, вы можете использовать перемотку (fp) для перемещения указателя 1 назад и продолжить использование fscanf.

+0

Видел ваш пример сейчас, подходит правильно! – Ishan

+0

может редактировать мой код и показывать мне, что вы имеете в виду, я вполне понимаю, что вы пытаетесь сказать? –

+0

Как это @Zero? :) – Ishan