0

以下のコードで 2 番目の文字列を入力するたびに、エラー ボックスが表示されます。コンパイラとしてコードブロックを使用しています。ポインタからポインタへのポインタを使用しているためですか?

#include<stdio.h>
#include<conio.h>
void sort_string(char **) ;
void main()
{
    char *name[5] ;
    int x =0;
    printf("Enter Names");
    for(x = 0 ; x < 5 ; x++)
    {   fflush(stdin);
        fgets( name[x], 100,  stdin);
    }
    sort_string(name);
    for( x = 0 ; x < 5 ; x++)
    {
        puts(name[x]);

    }


}
void sort_string(char *name[5])
{
    char *temp;
    int i , j ;
    for ( i = 4 ; i >=0; i--)
    {
        for ( j = 0 ; j <=i; j ++  )
        {
            if(strcmp(name[j] > name[j+1]))
            {
                temp = name[j+1];
                name[j+1] = name[j];
                name[j] = temp;
            }
        }
    }
}
4

4 に答える 4

0

fgets( 名前[x], 100, 標準入力);

未割り当てのメモリにコピーしています。

char *name[5] ;

サイズ5の文字ポインター配列のみを作成します。値をそのポインターに初期化する必要があります。

于 2013-04-09T14:24:09.570 に答える
0

質問のコメントで述べたように、name要素にメモリを割り当てる必要があります。fgets簡単な方法の 1 つは、名前の長さを 99 文字 ( に渡される制限) にハードコーディングし、配列を次のように変更することに注意することです。

char name[5][100];

これを行うと、文字列の比較が正しくなくなります。変更できますか

if (strcmp(name[j] > name[j+1]))

if (strcmp(name[j], name[j+1]) > 0)

これにより、別のバグが表示されます。内部ループは まで実行できますj=4。次に、にアクセスするときに、配列の末尾を超えて読み取り/書き込みを行いますname[j+1]。ここでの最も簡単な修正は、内側のループを変更して 1 回の反復を早く終了することです。

for (j=0 ; j<i; j++)
//          < rather than <=
于 2013-04-09T14:17:25.787 に答える
0

name[]正しく割り当てていません。現代の言語のほとんどは、文字列などの割り当てを処理しますが、C は古い言語であり、自分で管理する必要があります。これを行うにはいくつかの方法があります。

char name[5][100];

これにより、500 バイト長のローカル 2 次元配列がスタックに割り当てられます。 name[0]割り当ての開始時に 100 文字の配列を参照します。 name[1][3]の 104 番目のバイトである 2 番目の 100 文字バッファーの 4 番目の文字を参照しnameます。 name[4]最後の 100 文字の配列です。

char *name[5];
int i;
for(i = 0; i < 5; i++) {
    name[i] = malloc(sizeof(char)*100);
}

これnameは 5 つの値の配列でchar *、おそらく 40 バイトの長さです。これらの各ポインターは、ヒープ上の個別の 100 バイトの割り当てを指します。name[5][100]2 次元配列ではなく割り当ての配列ですが、上記と同じ方法でバッファラーとその中の文字を参照します。

于 2013-04-09T14:28:46.847 に答える