1

Word でいっぱいの巨大な stdin を読み取るプログラムを作成しています。入力を最大 100 文字の文字列に分割したい。だからここに私のコードがあります。

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

static char* string = "\0";

void getChar(char new){
    if (strcmp(string,"\0") == 0){
        free(string);
        string = (char *) malloc(sizeof(char));
        if (string == NULL){
            exit(EXIT_FAILURE);
        }
        string[0] = new;
    } else {
        char* newString = (char*) realloc(string, sizeof(string)+sizeof(char));
        if (newString == NULL){
            exit(EXIT_FAILURE);
        }
        string = newString;
        string[strlen(string)]=new;
    }
    if (strlen(string) > 100){
        printf("%s\n",string);
        dosomething(string);
        string = "\0";
    }
}

void getInput(){
    int temp;
    while((temp = fgetc(stdin)) != EOF){
        getChar((char) temp);
    }
}

int main(int argc, char *argv[]){
    getInput();
}

コードをコンパイルして実行すると、すぐに次のようなエラーが表示されます。

*** glibc detected *** ./sort: realloc(): invalid next size: 0x08f02008 //ofc this address always changes

それ以降のバージョンでは、100 文字を超える文字列を無視して \n でフィルタリングします。

4

1 に答える 1

3

sizeof(string)実際には、それが指すものの長さではなく、string それ自体のサイズを示します(ポインター、それが何であるかです)。string文字列の長さを自分で追跡する必要がありstrlenます.

他にもバグがいっぱい。最初は、割り当てたスペースを指すfree(string)前に発生します。これは致命的です。string

于 2013-05-16T02:59:09.503 に答える