3

!@#$%^&*()_+ のような数字や記号から文字列をクリアする関数を書きたいのですが、常に次のエラーが発生します: * glibc が検出されました./clear: 無効な fastbin エントリ (無料): 0x0000000001d29490 * *

コードは次のとおりです。

void clean(char *dirty)
{
    int i = 0, j = 0;
    char *temp;

    temp = strdup(dirty);
    while(i < strlen(temp))
    {
        if(isalpha(temp[i]) && isspace(temp[i]))
        {
            dirty[j] = temp[i];
            j++;
        }
        i++;
    }
    dirty[j] = '\0';
    free(temp);
}
4

5 に答える 5

2

の戻り値を確認する必要がありstrdupます。メモリの割り当てで問題が発生した場合 (メモリが不足しているなど)、temp値を取得しますNULL。そうであるかどうかを確認し、エラー メッセージを表示して終了します。


if ステートメントは常に false です。

if(isalpha(temp[i]) && isspace(temp[i]))

temp[i]英数字スペースの両方を使用するにはどうすればよいでしょうか?


また、(これは問題ではありませんが) これはむしろ (配列のすべての要素を最後までループする) ための仕事であることにも注意してforくださいwhile。期待されるイディオムを使用することは常に良いことです。

これはその場で行うこともできます (temp文字列は必要ありません):

dirty[j] = dirty[i];

以来iより大きいか等しいjです。

于 2013-09-10T09:20:45.630 に答える
1
if(isalpha(temp[i]) && isspace(temp[i]))      // logic AND. The character could not be both alpha and space

する必要があります

if(isalpha(temp[i]) || isspace(temp[i]))      // logic OR.

コードの残りの部分は問題ありません。

アップデート:

コードは私の Windows PC で正常に動作します。したがって、ここではerrno、何が間違っているかを確認することをお勧めします。

もう1つ、ポインターchar *dirtyを確認し、char *tempそれらを使用する前に空であるかどうかを確認してください。

アップデート:

説明する便利なリンクstrdup: Strdup return address out of bounds

于 2013-09-10T09:19:44.397 に答える
0

ループのロジックに欠陥があるようです。これは決して保持されません

isalpha(temp[i]) && isspace(temp[i])

最後jはいつもそうです。0

于 2013-09-10T09:20:00.373 に答える
0

Linux で作業している場合は、メモリの問題を検出するために valgrind の使用を検討してください。

于 2013-09-10T10:07:35.490 に答える