-1

これが文字列を印刷するための私のコードです

char accname[MAX][MAXSTRING], transname[MAX][MAXSTRING];

printf ("Enter title for new account: ");
accname[i][i] = validatestring();
printf ("\n");

printf ("Enter title for transaction: ");
transname[i][i] = validatestring();
printf ("\n");

printf ("%s  %s", accname[i], transname[i]);

validatestring()の私のコード

char validatestring() {
    int keeptrying = 1, rc;
    char i[31];
    do
    {
        rc = scanf("%30[^\n]", &i);
        if (rc == 0)
        {
            printf (" **Invalid input try again: ");
            clear();
        }
        else if (getchar() != '\n')
        {
            printf (" **Title is longer than 30 characters: ");
            clear();
        }
        else
        {
            keeptrying = 0;
        }
    } while (keeptrying == 1);
    return i;
}

accname [i] / transname [i]のprintfステージで、入力した値が取得されない、奇妙な変換文字列型が取得される、入力の最初の文字が取得されることがあるが、今ではまったく異なるものが得られる。誰かがその理由を理解できますか?

4

2 に答える 2

2

あなたのvalidatestring機能は絶望的に壊れています。

まず、 return として宣言validatestringしましたchar。それでも、そこからa を返そうとしますchar *( を参照してください) 。これはコンパイルさえすべきではありません。return iichar [31]

第 2 に、 から文字列を返す場合validatestringは、ローカル バッファへのポインタを返していないことを確認する必要があります。iローカル配列です。から へのポインタをi返すことはできませんvalidatestring

于 2012-12-02T20:00:15.750 に答える
1

ええ、それはあなたがしていることは、すべてを 1 つの文字に格納しようとしているからです。

array[i][i]

これは、すべてを格納しようとしている文字の位置です

あなたが意図していることは

*array[i]  // It is a pointer to that location which you referring to.

これにより、文字列が array[i] に格納され、そこから文字にアクセスできます

 array[i][i]

これで問題が解決することを願っています。また、関数は char ポインター char* を返す必要があります。

これはそれを行う必要があります:

   *accname[i] = validatestring();

また、関数の戻り値の型を char* に変更します

于 2012-12-02T19:57:01.513 に答える