2

課題に小さな問題があります。プログラム全体はツリーデータ構造に関するものですが、問題はありません。

私の問題は、いくつかの基本的なことです: ユーザー入力から文字列を読み取り、それらを配列listに格納します。

char str[1000];

fgets(str, 1000, stdin);

int x = 0;
int y = 0;
int z = 0;

char **list;
list = (char**)malloc((x+1)*sizeof(char));
list[x] = (char*)malloc((y+1)*sizeof(char));

while(str[z] != '\n')
{
    list[x][y] = str[z];
    z++;

    if(str[z] == ',')
    {

        x++;
        y = 0;

        list = (char**)realloc(list, (x+1) * sizeof(char*));
        list[x] = (char*)malloc((y + 1)*sizeof(char));

        z++;
        if(str[z] == ' ') // Skips space after the comma
        {
            z++;
        }

    }
    else if(str[z] == '\n')
    {
        break;
    }
    else
    {
        y++;
        list[x] = (char*)realloc(list[x], (y+1)*sizeof(char));

    }

}

このリスト配列を別の関数に渡します。例として、入力は次のようになります

Abcde, Fghijk, Lmnop, Qrstu

そして、これらの各単語を配列リストに分割しようとしています。

Abcde
Fghijk
Lmnop
Qrstu

文字列を出力しようとすると、逆さまの疑問符や数字など、奇妙で過剰な文字が表示されることがあります。

printf("%s ", list[some_number]);

私を取得します

Fghijk¿

また

Fghijk\200

私のプログラムはすべて、解決に苦労しているこの小さな問題を除いて、期待どおりに機能します。同じ正確な入力でも、バグが表示される場合と表示されない場合があります。私はそれがメモリ割り当てに関係していると推測していますか?

ご協力いただきありがとうございます!

4

3 に答える 3

3

新しい文字列の末尾に「\0」を付ける必要があります。

于 2013-06-04T15:11:15.860 に答える
2

などのほとんどのCライブラリ関数を参照してprintf、文字列をすべての末尾文字としてstrlen処理します。\0そうしないと、メモリ違反が発生するか、メモリ内の値0が停止し、メモリ内のすべてのバイトがextended ascii同等に解釈される場所でメモリを読み取り続けるため、このような奇妙な動作が発生します。

したがって、文字に余分なバイトを\0割り当て、最後のバイトに割り当てます。

于 2013-06-04T15:15:56.707 に答える
0

変数をnullに初期化するか、トマトが言ったように、新しい文字列の最後にnull文字を入れてください。

C には、メモリ管理に関して、プログラマーが現在当たり前と思っている贅沢の多くが欠けています。あなたは正しい道をmalloc進んでいますが、その関数はメモリを割り当てるだけです...それはクリアしません。その結果、変数には適切な量のスペースが確保されますが (メモリ リークやオーバーフロー エラーを減らすために重要です)、ゴミでいっぱいになります。このガベージは何でもかまいません。あなたの場合、それは逆さまの疑問符です。適切ですね。

詳細情報がないとコードを自分で実行できないため、間違っている可能性がありますが、

char **list;
list = (char**)malloc((x+1)*sizeof(char));
list[x] = (char*)malloc((y+1)*sizeof(char));

ステートメントでは、次のようなことをしたいと思うでしょう:

list = NULL;

ゴミを片付けるなど。

さらに、strlen()関数 ( に含まれるstring.h) を使用して、割り当てる必要があるメモリ ブロックの数を把握することもできます。

変数に使用するスペースをクリアすることは、C を始めるための良い習慣です。あなたもそれを学んでいるのを見るのは良いことです。

于 2013-06-04T15:23:06.740 に答える