2011-04-08 98 views
0

我有類似的東西(沒有間距問題),我正在讀取文件,字符串之間用#符號分開,並試圖將它們中的每一個讀入char *的數組中。但是,每個包含字符串的char*很多都是字符串的確切長度。雖然這是一個小錯誤。C:將字符串文件讀入字符數組*

char * fragments[1000]; 
char temp[20]; 
     while (i < numFrags) { 
      if (fscanf(fp, "#%15[^#]#", temp) == 1) { 
      char entry[strlen(temp)]; 
     entry = strcpy(entry, temp); 
     fragments[i++] = entry; 
     printf("%d\n", strlen(temp)); 

      } 
     } 

想法?

+1

「有點小車」沒有用。請告訴我們這些錯誤實際上是什麼,例如你的投入,你的期望以及你得到的結果。 – 2011-04-08 17:23:58

+0

char *如何可以「是字符串的確切長度」?或者你的意思是每個char *都必須指向一個長度相等的字符串集合中的一個? – 2011-04-08 17:24:34

+0

我認爲「一個小小的車」是OP的隱喻:你看到的每個字符串都包含它攜帶的字符,就像一輛小馬車或一輛紅色的小馬車一樣。我可能是錯的。 – 2011-04-08 17:28:44

回答

2

你的問題是你正在重新使用entry數組。

看看如何爲所有i我們有fragments[i++] = entry;。最後,每個片段將指向相同的地方,因此將包含相同的字符串(在這種情況下,它將是最後一次讀取的字符串)。

看來,如果你試圖通過同時使用tempentry陣列來解決這個問題,但最終,你還不如直接已經取得了fscanf寫入到陣列entry


,你可以得到的另一個問題是,如果你的指針指向了automaticaly堆棧(即:一個函數內聲明的數組)上分配的數組。這些內存位置在你的函數返回後被你的程序重用,你的指針可以開始指向無效數據(因爲這是C,使用這些損壞的字符串會導致各種崩潰和不良程序行爲)。


你的問題基本上是一個內存分配問題,所以有很多解決方案。

  1. 使fragments是一個字符數組(而不是指針)的數組。這樣,您可以安全地爲每個字符串分配不同的內存。

    char fragments[2000][20]; //can hold 2000 19-character strings 
    for(i=0; i<N; i++){ 
        scanf("%d", fragments[i]); 
    } 
    

    該解決方案的優點是它很簡單,並且所有內存都是預先分配的。

  2. 使用動態內存分配與malloc。這允許您爲每個字符串選擇不同大小的數組,並且還允許您在運行時而不是編譯時選擇數組大小。

    char* fragments[2000]; 
    char entry[MAX_FRAGMENT_LENGTH]; //temporary buffer for strings 
    for(i=0; i<N; i++){ 
        scanf("%d", entry[i]); 
        //dynamically allocate an array, just big enough to fit our string in. 
        fragments[i] = malloc(sizeof(char) * (1 + strlen(entry)); 
        strcpy(fragments[i], entry); 
    } 
    

    該方法的主要優點是它非常靈活,但仍然相當簡單。主要的缺點是,你需要free所有的指針已經完成malloc - 完成後(否則你可以得到一個內存泄漏)。

  3. 手動執行「動態分配」,使用單個大緩衝區來包含所有字符串。

    char buffer[2000*20]; 
    char* fragments[2000]; 
    char* next_empty_location = buffer; 
    for(i=0; i<N; i++){ 
        scanf("%d", next_empty_location); 
        fragments[i] = next_empty_location; 
        next_empty_location += strlen(next_empty_location) + 1; 
    } 
    

    如果你不能/不想/不允許使用malloc的解決方案,這是最近發生什麼。這可能比較難以理解(如果你對C有問題),但最好似乎適合含糊不清的「每個包含字符串的char *都是字符串限制的確切長度」。

+0

+1非常好的答案 – 2011-04-08 20:28:05