-3

現在、プログラムが本来あるべき方法で実行されない理由に困惑しています。実行すると、最初の cout & cin ステートメントのみが実行され、2 番目のステートメントは完全にバイパスされます。プログラムは 2 つの名前を要求し、それらを文字列オブジェクトに格納する必要があります。

次に、大文字と小文字の区別を無視して、それらが同じであるかどうかを報告する必要があります (「jack」という名前が「JACK」と同じであるかどうかのテストと同様に、小文字/大文字の違いを無視して名前が同じであることが示されます)。 .) 質問は、プログラムに必要な 2 つのヘッダーを示したので、初心者には bool ヘッダーと string ヘッダーが表示されます。

ここに私の現在のコードがあります: http://pastebin.com/Ju0MjkfP

#include <iostream>
using namespace std;

string upperCaseIt(string s);
bool sameString (string s1, string s2);

int main ()
{
    char name1, name2;

    cout << "Enter a name: ";
    cin >> name1;

    cout << "Enter another name and I will test if they are the same.";
    cin >> name2;

    if (name1==name2)
       cout << name1 << " is the same as " << name2 << endl;

    if (name1!=name2)
        cout << name1 << " is not the same as " << name2 << endl;

    system ("pause");
    return 0;
}
bool sameString (char name1)
{
     if (name1)
        return true;
     else
         return false;
}

編集:「ジャック」と「ジャック」を入力してテストしました。

ヒントをいただければ幸いです。ありがとう。

4

3 に答える 3

2

他の正解について詳しく説明すると、2 番目の cin を「スキップ」する理由は、入力がバッファリングされるためです。名前を尋ねられたら、いくつかの文字 (Mike など) を入力します。次の行は、operator>>cin のメソッドを呼び出して、入力したデータを保存します。として宣言name1した場合std::string、改行文字まで読み取られ、文字列 "Mike" が変数に保存され、改行が破棄されます。その時点で、入力したすべての文字が読み込まれるため、バッファには何も残りません。

ただし、 -- 単一の文字name1として宣言しました。charしたがって、C++ がcin >> name1呼び出しを行うとき、C++ は 1 文字しか格納できないことを正しく認識するので、読み取るのはそれだけです。つまりname1、「M」だけで、まだ読まれていないものが残っています。この場合は「イケ」です。そのため、次回読み取りが必要になったときに、他の何かを入力するのを待つ必要はありません。すでに満たされたバッファからの読み取りを続行するだけです。

于 2013-11-10T18:52:34.663 に答える