0

未知のサイズと数の文字列を書きたい char** stringList があります。

ある時点で、次のコードがあります。

static char** stringList;
static int laenge=0;
static int size=0;

void getInput(){
    char input[FILENAME_MAX];
    int zeilen=10;
    int counter=0;
    stringList = (char**) malloc(zeilen*sizeof(char*));
    size = zeilen*sizeof(char*);
        while(fgets(input, FILENAME_MAX , stdin) != NULL)
        {
        if (strlen(input) <= 100){
            stringList[counter] = (char*) malloc(strlen(input));
            size += strlen(input);
            if (stringList[counter] == NULL){
                exit(EXIT_FAILURE);
            }
            strcpy(stringList[counter],input);
            counter++;
            laenge++;
        } else {
            fprintf(stderr,"String longer than 100 characters\n");
        }
        if (counter==zeilen){
            zeilen +=10;
            stringList = (char**) realloc(stringList,size+10*sizeof(char));
            if (stringList == NULL){
                exit(EXIT_FAILURE);
            }
        }
        }
}

必要に応じて、stringList のサイズを増やして、より多くの文字列を格納できるようにします。

Valgrind は 1 行目と 5 行目で writeerror を返し、2 行目でも readerror を返します。

4

3 に答える 3

1

counterまず、文字列のバッファを割り当て、それが を超えて増加しないことを確認する必要がありmax_stringsます。

char** stringList = (char**)malloc(max_strings*sizeof(char*));

行 (1) は次のようになります (sizeof ではなく strlen):

stringList[counter] = (char*) malloc(1+strlen(input));

行 (5) は次のようになります (割り当てられたメモリに文字列をコピーする必要があります)。

strcpy(stringList[counter], input);
于 2013-05-16T13:01:11.017 に答える
0

まず第一に、不確定な数の要素を配列に格納したい場合 (その場合char*)、連結リストを使用する必要があります (ネット上にはたくさんのチュートリアルとコード サンプルがあります)。(内部的に新しいバッファを割り当ててから、古いバッファからすべてを新しいバッファにコピーします)。char**reallocrealloc

ただし、保持したい場合char**は、変更する必要があることがいくつかあります。

  • mallocまず、最初に呼び出したときの戻り値を確認する必要があります

  • 2 番目に、 (後で実行するために)'\0'最後に文字を追加する必要があります。char*

    stringList[counter] = (char *)malloc(strlen(input) + 1); // I add "+ 1"
    stringList[counter][strlen(input)] = '\0'; // 0 works also
    
  • size第三に、変数は役に立たないので削除する必要があります

  • 4番目に、if (counter==zeilen)ブロック内の2行目は次のようになります。

    stringList = (char**) realloc(stringList,zeilen*sizeof(char*)); // I replaced char by char * and used zeilen instead of "size+10"
    

    その問題が発生したくない場合は、コードの malloc/realloc 内の別の場所で, およびchar*by に置き換えることができます。*stringListchar*(stringList[counter])sizeof

さらに、あなたの例ではlaengeは使用されておらず、グローバル変数も悪い習慣です。

于 2013-05-16T14:49:23.983 に答える
0

にさらにメモリを割り当てたい場合はchar **stringList、次を使用できますrealloc()

ところで

これ

stringList[counter] = input;

に変更する必要があります

strcpy(stringList[counter], input);

それ以外の場合は、割り当てメモリ

stringList[counter] = (char*) malloc(sizeof(input));

無意味だろう

于 2013-05-16T12:52:59.613 に答える