2

ユーザーが入力した配列 (文字列) へのポインターを作成しようとしています。

ここで、クラスでポインターと配列を定義します。

private:

char userWord[200];     // input word
char * userWordPtr; // Pointer to the beginning of the input word

情報を読み取る関数は次のとおりです。

void WordFont::inputWord()
{

    cout << "What word would you like to draw?\n"
         << "The useable characters are: A E I O U Y B C D L M N R S T\n" ;
    cout << "Please enter your word: ";
    cin.get(userWord, 200);
    cin.clear();
    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

    userWordPtr = &userWord;

}

ユーザーが単語を入力すると、コードは単語の文字に基づいて何か (長い if-else はしご) を実行します。しかし、* Ptr を if-else ラダーに渡す際に、ポインターの位置をインクリメントしているときに、if-else ラダーにヌル (/0) 文字を認識させることができません。また、'&' を使用して char 配列の先頭のアドレスを参照するとエラーが発生します。なぜそのエラーが発生するのか、また、「i」が「/0」文字を持つメモリ内のランダムな場所に到達するまで、以下の if-else はしごが終了しない理由がわかりません。「AAA」と入力するだけの簡単な操作を行うと、「/0」文字がある 4 番目の位置をはるかに超えてしまいます。

ループは次のとおりです。

void WordFont::buildOutputArray(char * Ptr)
{

    length = 0;
    bool switchLooper = true;
    int i = 0;

    do
    {
        if(*Ptr + i == 'a' || *Ptr + i == 'A')
            constructA();
        else if (*Ptr + i == 'e' || *Ptr + i == 'E')
            constructE();
        else if (*Ptr + i == 'i' || *Ptr + i == 'I')
            constructI();
        else if (*Ptr + i == 'o' || *Ptr + i == 'O')
            constructO();
        else if(*Ptr + i == 'u' || *Ptr + i == 'U')
            constructU();
        else if(*Ptr + i == 'b' || *Ptr + i == 'B')
            constructB();
        else if(*Ptr + i == 'c' || *Ptr + i == 'C')
            constructC();
        else if(*Ptr + i == 'd' || *Ptr + i == 'D')
            constructD();
        else if(*Ptr + i == 'l' || *Ptr + i == 'L')
            constructL();
        else if(*Ptr + i == 'm' || *Ptr + i == 'M')
            constructM();
        else if(*Ptr + i == 'n' || *Ptr + i == 'N')
            constructN();
        else if(*Ptr + i == 'r' || *Ptr + i == 'R')
            constructR();
        else if(*Ptr + i == 's' || *Ptr + i == 'S')
            constructS();
        else if(*Ptr + i == 't' || *Ptr + i == 'T')
            constructT();
        else if(*Ptr + i == '\0')
            switchLooper = false;
        i++;
    }while(switchLooper);


}

これはおそらく簡単な初心者の間違いであり、他の多くの問題に気付くことになると思いますが、どんな助けでも大歓迎です。

ありがとう、トム

4

2 に答える 2

4

ユーザーが単語を入力すると、コードは単語の文字に基づいて何か (長い if-else はしご) を実行します。しかし、* Ptr を if-else ラダーに渡す際に、ポインターの位置をインクリメントしているときに、if-else ラダーにヌル (/0) 文字を認識させることができません。

実際、あなたが使って*Ptr + iいるのは次のとおりです。

  • Ptrポインターの逆参照( が指すアドレスの値にアクセスしていますPtr)
  • i次に、アドレスに含まれる値に追加していますPtr

Sergeが答えてくれました*(Ptr + i)。そのアドレスのキャラクターを取得するには、を使用する必要があります。

ここでは、 「ブロック」のPtrポインターをシフトしています。i

また、'&' を使用して char 配列の先頭のアドレスを参照するとエラーが発生します。なぜそのエラーが発生するのかわかりません。

charの配列(または何でも) はポインターのようなstr[i]ものです (違いはたくさんありますが、それらを発見する楽しみを与えてくれます) *(str + i)

また、「i」が「/0」文字を持つメモリ内のランダムな場所に到達するまで、以下の if-else はしごが終了しないのはなぜですか。「AAA」と入力するだけの簡単な操作を行うと、「/0」文字がある 4 番目の位置をはるかに超えてしまいます。

もうこの問題はありません。

ユーザーが 200 文字を入力するとどうなりますか?

于 2012-10-31T20:34:57.190 に答える
0

これを行っているスタイルは適切ではありませんが、修正は all*Ptr + iをに置き換えること*(Ptr +i)です。tolower()およびstricmp()関数に関するドキュメントを読むことをお勧めします

于 2012-10-21T03:50:43.113 に答える