2014-09-25 58 views
0

我正在研究一個實驗任務,我們需要創建一個字典來保存一些單詞和他們的海盜講話等價物。我能夠讀取文件,將單詞分隔出來,如sscanf函數所示,但是當我使用strcpy將每個單詞存儲在它們各自的陣列中時,出現了分段錯誤:strcpy(&eng[i], englishWord);Strcpy() - C中的分段錯誤

我不明白如何糾正這個問題。 (很抱歉,如果我的代碼是難看這是在我的C.第一次編程)

void CreateDictionary(char eng[], char pir[]){ 
    char word[40]; 
    FILE* dictionary; 

    const char *pirateWord; 
    const char *englishWord; 

    dictionary = fopen("english-to-pirate.txt", "r"); 
    if (dictionary == NULL){ 
    printf("Unable to open the dictionary file.\n"); 
    } 
    else{ 
    //Setup dictionary 
    int i = 0; 

    while(fgets(word, sizeof word, dictionary) != '\0'){ 
     //Split line using semicolon 
     sscanf(word,"%[^;];%[^;]", englishWord, pirateWord); 
     printf("%s : %s",englishWord, pirateWord); 

     //put term in corresponding array 
     strcpy(&eng[i], englishWord); //seg fault occuring here 

     strcpy(&pir[i], pirateWord); 
     i++; 
    } 
    } 
    fclose(dictionary); 
} 

這是正在被調用的函數:

int main() { 
    char inFileName[100]; 
    char outFileName[100]; 
    FILE* inFile; 
    FILE* outFile; 
    char english[75] = {[0 ... 74] = '\0'}; 
    char pirate[75] = {[0 ... 74] = '\0'}; 

    CreateDictionary(english, pirate); 

    return 0; 
} 
+1

您是否意識到,char char [75]'不是字符串數組?它是一個字符串。所以很奇怪你試圖把字典放入這個字符串中。它看起來像你需要使用字符串數組而不是字符數組。 – Ilya 2014-09-25 03:20:31

+0

我想我沒有......這是有道理的。謝謝你指出。我現在想要弄清楚這個部分! – bullinka 2014-09-25 03:40:08

回答

1

沒有與englishWord, pirateWord在相關聯的分配存儲器用於放置掃描數據。

使用char pirateWord[sizeof word]; char englishWord[sizeof word];

總是好的檢查sscanf()

if (2 != sscanf(...)) FailedToScan(); 
+0

這解決了我的問題,我明白爲什麼現在發生這個問題。非常感謝! – bullinka 2014-09-25 03:23:48

0

您必須具有存儲(和足夠的內存)分配給在strcpy的目的指針的結果。在沒有看到CreateDictionary的調用代碼的情況下,無法診斷出錯的地方。

如果調用代碼沒有爲eng []分配內存,則可以考慮使用strdup而不是strcpy。 strdup將分配足夠的內存來保存字符串。