2015-01-11 13 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にはメモリが割り当てられていません。現在の形式のプログラムは、ユーザーがプログラムに単語を入力すると、割り当てられていないメモリを踏みとどっています。

あなたの入力が可能と次のように入力バッファを割り当てるだろうか大guesstimate必要があります。

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

ああ!私はどんなに愚かなのか、それはいつも見過ごされる細部のようです。この修正は魅力のように助けになりました。どうもありがとうございます! – colinmcp

+0

また、 'sizeof'演算子は' word'の文字数を数えないので、OPのコードでコメントアウトされた 'fgets(word、sizeof(word)、stdin);'は間違っています。 'word'変数の型であり、wordはポインタ' sizeof(word) 'なので、ポインタのサイズ、つまり 'sizeof(char *)'を与えます。 OPがこの解決法を使用する場合、その場合には、「sizeof」演算子がうまく適用されます。 –

+2

@colinmcpああ、また、scanf( "%79s"、word);を実行するバッファオーバーフローを防ぎます。ヌル終了バイトを考慮する必要があるので、配列のサイズから1を引いた数です。 –