0

関数gets()を使用して、ユーザーから文字列入力を取得しています。次に、その文字列をchar配列char transdestmp [DESMAX]に格納します。DESMAXは31です。variable_nameが30文字より大きい場合は、ユーザーに別の文字列を借りるように依頼します。それ以外の場合は、strcpy()を使用して文字列を2次元配列char --acctdes[31][20]にコピーします。

accttitleがtransdestmp[DESMAX]を受信します

void accttitle(char descr[DESMAX])
{
    printf("\nEnter title for new account %d: ", transinpt);
    gets(descr);
    while(strlen(descr)>DESMAX){
        printf(" **Title entered is longer than 30 characters\n");
        printf(" Please reenter : ");
        gets(descr);
    }
    strcpy(acctdes[transcntr],descr);
    printf("---->vacctdes[transcntr]: %s\n", acctdes[transcntr]);
    printf("---->vacctdes[transcntr-1]: %s\n", acctdes[transcntr-1]);
}

何らかの理由で、長い文字列を入力してから別の文字列を入力すると、2番目の文字列の一部であるacctdes [1]が、acctdes[0]に格納されている他の文字列を上書きします。

例えば、

最初の入力:acctdes [0]="これは長い文字列です"

できます...

2番目の入力acctdes[1]= "monkey"

できます...

しかし、acctdes [0]を出力すると、acctdes[0]はacctdes[1]からの値の一部を持っているようです...出力のように-これは長い僧侶です...

さらに詳しい情報が必要な場合はお知らせください。前もって感謝します。

4

3 に答える 3

1

配列宣言は逆にする必要があります。

現在、次のものがあります。これは、それぞれ文字の長さのプレースホルダーacctdes[31][20]を意味します。それぞれ31文字の長さに対して20個のプレースホルダーが必要です。3120

次のように変更する必要がありますacctdes[20][31]

于 2012-12-02T17:35:42.320 に答える
1

「関数gets()を使用して、ユーザーから文字列入力を取得しています。」

それはあなたの問題、または少なくともその一部です。

この機能は絶対に使用しないでくださいgets()。に表示される入力を完全に制御できない限り、本質的に安全ではありませんstdin。入力の文字数を指定するメカニズムはありません。ユーザーがターゲット配列に収まるよりも多くのデータを入力した場合、プログラムの動作は未定義です。

fgets()代わりに使用してください。ターゲットバッファのサイズを指定する引数を取ります。入力行が長すぎる可能性に対処する必要があります(この場合、fgets()一部の行を格納するだけです)。入力行が長すぎない場合は、とは異なり、をバッファにfgets()残します。'\n'gets()

非常に悪いので、最新(2011)のISOC標準から削除されました。

(他の回答も参照してください。)

于 2012-12-02T20:48:49.203 に答える
0

配列の次元が逆になっています。試してみてくださいacctdes[20][31]

文字列が互いにブリードする理由は、Cが2次元配列を1つの長いメモリブロックとしてレイアウトするためです。acctdes[2]内部で実際にポインタ演算を行う場合*(acctdes + (31 * 2))は、メモリブロックの最初の部分をスキップして、3番目の要素に到達するようにします。したがって、ある文字列がその境界を超えて書き込むと、次の文字列になります。

于 2012-12-02T17:40:30.937 に答える