2015-01-11 414 views
6

因此,我重新熟悉了C,而這個概念讓我特別被卡住了。如何將字符串添加到字符串數組中C

目標是創建一個動態分配的字符串數組。我做了這件事,首先創建一個空數組,併爲每個輸入的字符串分配適當的空間量。唯一的問題是,當我嘗試添加一個字符串時,我遇到了seg錯誤!我不知道爲什麼,我有一個預感,它是來自不正確的分配,因爲我看不到我的strcpy函數有什麼問題。

我在這個網站上詳細查看了一個答案,我找到了幫助,但不能完成交易。任何幫助,你可以提供將不勝感激!

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

int main() 
{ 
    int count = 0; //array index counter 
    char *word; //current word 
    char **array = NULL; 


    char *term = "q"; //termination character 
    char *prnt = "print"; 

    while (strcmp(term, word) != 0) 
{ 
    printf("Enter a string. Enter q to end. Enter print to print array\n"); 
    // fgets(word, sizeof(word), stdin); adds a newline character to the word. wont work in this case 
    scanf("%s", word); 

    //printf("word: %s\nterm: %s\n",word, term); 

    if (strcmp(term, word) == 0) 
    { 
    printf("Terminate\n"); 
    } 

    else if (strcmp(prnt, word) == 0) 
    { 
    printf("Enumerate\n"); 

    int i; 

    for (i=0; i<count; i++) 
    { 
     printf("Slot %d: %s\n",i, array[i]); 
    } 

    } 
    else 
    { 
    printf("String added to array\n"); 
    count++; 
    array = (char**)realloc(array, (count+1)*sizeof(*array)); 
    array[count-1] = (char*)malloc(sizeof(word)); 
    strcpy(array[count-1], word); 
    } 

} 

    return ; 

} 

回答

6

word沒有分配給它的存儲器。當前用戶的程序正在踐踏未分配的內存,因爲用戶在程序中輸入了單詞。

你應該推測將會你的投入將有多大,並分配輸入緩衝區這樣的:

char word[80]; // for 80 char max input per entry 
+0

啊!我多麼愚蠢,似乎總是被忽視的細節。這固定幫助像魅力。非常感謝! – colinmcp

+0

另外,'fgets(word,sizeof(word),stdin);'在OP代碼中註釋掉'是錯誤的,因爲'sizeof'運算符不會計算'word'的字符數,而是返回'word'變量的類型,並且由於單詞是指針'sizeof(word)'將給出指針的大小,即'sizeof(char *)'。如果OP使用這種解決方案,那麼在這種情況下'sizeof'運算符就很適用。 –

+2

@colinmcp呵呵,還要防止緩衝區溢出做'scanf(「%79s」,word);'這個數字是數組的大小減1,因爲你應該考慮空終止字節。 –