1
openFile(argv[1],"r");
while(characterBuff != EOF)
{
    characterBuff = fgetc(examFile);
    memoryAlloc += 1;
    string = expandRealloc(string, memoryAlloc);
    appendString(string, characterBuff);
    printf("%s\n", string);
}
closeFile();
free(string);

次のコードでは: printf から取得している出力は、[somehash]D[somehash]E[somehash]S[somehash]K のような ackward 値を示します。

「DESK」という出力ワードを取得していますが、メモリからランダムなものがすべて取得されています。何が間違っていますか?

注: 以下は malloc(sizeof(char)) で割り当てられており、単一の文字が文字列に追加されるたびに再割り当てされます。

つまり、出力は次のようになります。 D De Des Desk しかし、その代わりに、以前に示したものを取得しています。

編集:

char* expandRealloc(char* ptrS, size_t n)
{
    void *tmp;
    if((tmp = realloc(ptrS, n)) == NULL)
    {
        printf("Error: Memory leak possible; Closing Program");
        exit(EXIT_FAILURE);
    }
    else
    {
        ptrS = tmp;
        return ptrS;
    }
}

realloc のラッパー関数を作成しました。助けてくれてありがとう、それでも問題は解決しません。結果を印刷しようとすると、[somecrapmemoryhash][letter][somecrapmemoryhash][letter]が表示されます。

追加文字列:

void appendString(char* inputString, int inputChar)
{
    int stringLenght = strlen(inputString);
    inputString[stringLenght - 1] = inputChar;
    inputString[stringLenght] = '\0';
}
4

3 に答える 3

4

realloc呼び出されると、割り当てられたメモリが移動される可能性があるため、ポインタの古い内容を realloc によって返された値に置き換える必要があります。

試す

char *temp_string;
    .
    .
    .
temp_string = realloc(string, memoryAlloc);
if(temp_string != NULL)
  string = temp_string;

編集

ここでの問題の多くは、長い間標準ライブラリの一部であったことを行うためにユーザー作成関数を使用していることにあると思います。このコードを変更して、特別なラッパーなどを使用せずに標準の lib 関数を使用することは、それほど難しくなく、信頼性が向上します。例として、appendString 関数は、ここで遭遇した問題の多くの原因のようです。代わりに strcat 関数が使用されていれば (ソースにマイナーな変更を加えて)、大幅な悪化と髪の引っ張りを回避できたはずです。

標準ライブラリには優れた理由があります。それは一貫性があり、堅実で、デバッグされ、便利であり、そして - まあ - それは標準です。標準ライブラリに貢献してきた何百人もの人々よりも自分自身の方が賢いと考える人がいるとしたら、それは間違いである可能性が非常に高いです。ここにいる誰かが、標準ライブラリの関数を使用して基本的な操作を実行できないと考えている場合、彼らのニーズは非常に特殊であるため、おそらく間違っています。C 言語自体は特に特別なものではありません - 正直に言うと、中括弧はそれほど大したことではありません :-) - C の力は、「すべてを関数に入れる」という哲学から直接もたらされます。タスクを達成するための関数のライブラリ。標準ライブラリは、初心者の C プログラマーが学ぶ必要がある最も基本的なものです。

共有してお楽しみください。

于 2012-06-08T11:06:58.647 に答える
2

appendString関数が間違っています - 変更してください:

void appendString(char* inputString, int inputChar)
{
    int stringLenght = strlen(inputString);
    inputString[stringLenght - 1] = inputChar;
    inputString[stringLenght] = '\0';
}

に:

void appendString(char* inputString, int inputChar)
{
    int stringLength = strlen(inputString);
    inputString[stringLength] = inputChar;
    inputString[stringLength + 1] = '\0';
}
于 2012-06-08T13:27:43.010 に答える
0

あなたの文字列印刷の問題はNULL、文字列の最後にターミネーターがないように疑わしいように見えます...appendStringターミネーターを追加するのは面倒ですか?

于 2012-06-08T11:31:08.257 に答える