2013-04-04 221 views
1

我正在寫一個C代碼來逐行讀取包含字母,CR,LF,'\ 0'的行。以下是我附帶的代碼示例。我只想將每行的字母存儲到數組中,以便數組中的行數等於文件中行的數量,並且列的長度應該是變化的(取決於第i行中的字符數)。不同長度的字符串數組

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    char *buffer[100]; 
    char temp[128]; 
    int c,i=0,j=0; 
    int pos=0; 
    FILE *file; 
    file = fopen("input", "r"); 
    if (file) { 
     while ((c = getc(file)) != EOF){ 
      if ((c>=65 && c<=90) || (c>=97 && c<=122)) 
       temp[pos++]=c; 
      else if(pos>1) { 
       temp[pos]='\0'; 
       buffer[i]=temp; 
       printf ("%s\n",temp); 
       i++; 
       pos=0; 
      } 
     } 
    } 
    fclose(file); 
    while (j<i){ 
     printf("%s\n",buffer[j]); 
     j++; 
    } 
} 

如果我運行我的上面的代碼,我所有的緩衝區[j]包含相同的字符串。 任何人都可以幫助我找出代碼中的錯誤。

+2

**如果你問它,**調試器**會急切地執行任務*真正好*。除此之外,問問自己:「每當我進入一個新字符串時,我在那個指針數組中存儲了什麼?它是否是同一個緩衝區地址(temp)一遍又一遍?」 – WhozCraig 2013-04-04 12:49:35

回答

2

buffer[]指針數組,你while循環他們每個人你是指向你的陣列temp[]

buffer[i]=temp; // assign the address of temp to buffer[i] 

然後你改變你的temp[]陣列的內容,但地址總是一樣的。

如果你想temp您需要分配內存和那邊的數據複製數據到每個位置buffer[]。更像是:

buffer[i]=malloc(strlen(temp) + 1); 
strcpy(buffer[i], temp); 
+0

+1或者'buffer [i] = strdup(temp)'如果你感覺特別是POSIX-ish那天早上= P。很好的答案。 – WhozCraig 2013-04-04 12:57:37

+2

@WhozCraig即使你感覺POSIX-ish,堅持標準C.沒有理由在任何地方使用strdup。 – Lundin 2013-04-04 13:00:23

+0

@Lundin我會記住這一點。有人必須有一些拉,因爲POSIX.1-2001之前它不是POSIX標準的一部分。 – WhozCraig 2013-04-04 13:04:14

相關問題