2010-02-20 117 views
2

我試圖填充數組從一個文件名:如何用C中的字符串填充數組?

Andrew 
Andy 
Bob 
Dan 
Derek 
Joe 
Pete 
Richy 
Steve 
Tyler 

這裏是我寫的功能...但程序崩潰時我運行它:

#include <stdio.h> 

main(){ 
    int i=0, size=10; 
    char fname[15]; 
    char** data; 
    char* name; 
    FILE* fp; 

    printf("Enter a filename to read names:\n"); 
    scanf("%s", fname); 

    fp = fopen(fname, "r"); 
    if(fp == NULL) 
    exit(); 

    data = (char**)malloc(sizeof(char**)*size); 

    while(!feof(fp)){ 
    fscanf(fp, "%s", name); 
    data[i] = (char*)malloc(sizeof(name)); 
    data[i] = name; 
    i++; 
    } 

    fclose(fp); 

    printf("\n\n"); 

    for(i=0; i<size; i++) 
    printf("%s ", data[i]); 

    free(data); 
} 

任何人都知道我做錯了什麼? 謝謝

回答

5

你有幾個錯誤的位置:

1)你永遠不分配內存,其中name將得到保存。你可以解決這個簡單的使用:

char name[128]; 

然後,當你使用fscanf,你必須:

fscanf(fp, "%127s", name); // stores this in name correctly, now... 

2)你不恰當的data[i]分配空間:

data[i] = (char*)malloc(sizeof(name)); 

這將分配空間來容納一個指向字符char*),因爲名稱是char*。你需要做的:

data[i] = (char*)malloc(sizeof(char) * (strlen(name) + 1)); 

這將爲數據加上一個單一的終止字符分配足夠的空間。

3)您沒有正確指定data[i]。你不能只用=在這裏,但需要使用strcpy

strcpy(data[i], name); 

4)你不是在data[..]元素釋放個別指針。您應該添加,您的printf之後,自由:

for(i=0; i<size; i++) 
{ 
    printf("%s ", data[i]); 
    free(data[i]); // Free each pointer you allocate 
} 

malloc呼叫最終應該有一個匹配free電話。

+0

裏德,我不會失望,因爲你的回答是正確和正確的,但是當你不讓他考慮這個過程時,你並沒有幫助他。 – 2010-02-20 01:03:21

+0

非常感謝,現在正在工作。是的,我現在明白我做錯了什麼。 – Andrew 2010-02-20 01:03:50

+1

@San Jacinto:我不知道 - 我覺得這很清楚,但不僅僅是重寫他的所有代碼。如果沒有指出事情的缺陷,很難提供幫助......但我明白你的觀點。 @安德魯:我很高興它正在工作,你現在明白了。 – 2010-02-20 01:07:56

5

您從不爲名稱分配空間。但是,你把東西在這行:

fscanf(fp, "%s", name); 

變化

char name[100]; 

fscanf(fp, "%99s", name); 

你應該限制開關輸入到文件名太:

scanf("%14s", fname); 

還你永遠不要釋放每個元素的數據在數組中,如果這是一個較大系統中的子例程,它將會發生內存泄漏。

+0

哦......但是我怎麼知道有多少空間來如果我不知道這個名字會有多長時間,請分配一下?我是否必須掃描每一行的字符並計數? – Andrew 2010-02-20 00:53:51

+0

你應該有一個線路長度限制;創建一個緩衝區並掃描它 - 其餘的將被截斷。如果你想要無限長的行,你應該動態地重新分配緩衝區,直到讀取所有內容。 然後準確分配名稱中的字節數(+1)並將名稱放入它中。 – kibitzer 2010-02-20 00:56:50

+0

我總是做了一個非常大的緩衝區。但是你可以先掃描並計數是否需要。對於家庭作業,你可以做一個大緩衝區恕我直言 – Hogan 2010-02-20 00:56:59

0

存在相當多的問題。其他回答說名字沒有被初始化,所以我不會重複。

第二個問題是您沒有正確處理EOF。 feof只會在您試圖讀取文件末尾時纔會返回true。所以你會得到一個空的第11個名字。

最後一個問題是數據數組只能包含10個名字。由於第二個問題,您將使用空白的第11個名稱溢出緩衝區。此外,你的代碼取決於輸入文件的細節 - 給它一個不同的名稱更多的輸入文件,即使修復問題2後,你仍然會崩潰。