2016-11-05 15 views
0

私はもともとユーザーが文字を入力させるためにcinを使用していました。次に、この文字がa、b、またはcでなければ、ループし続けてエラーメッセージを出力します。ただし、ユーザーが複数の文字を入力すると、エラーメッセージが複数回印刷されます。だから私は文字列を取り、長さが1であるかどうかを調べるためにscanfを使っています。これはまっすぐで、まったく動作しません。文字列のC++入力文字またはチェック長は1ですか?

string enterLetter() { 
    string n; 
    scanf("%s", &n); 
    return n; 

} 


void main() { 
    string ch = ""; 
    cout << "Type a, b, or c: "; 


    while (ch != "a" && ch != "b" && ch != "c"){ 
     while (ch.length() != 1) { 
      ch = enterLetter(); 
      cout << ch.length(); 
     } 
     ch = tolower((char)ch.c_str()); 
     cout << "\n" << ch; 


    } 
+0

なぜあなたは、このための文字列を使用していますか? 'char'を使います。 –

+0

また、なぜあなたの主な方法は 'void'型ですか? –

+0

scanfはstd :: stringのではなく、cスタイルの文字列と組み合わせて使用​​します。 –

答えて

0

あなたはキーを入力することによって終了ユーザー入力の行全体を読み取るためにcin.getline()を使用することができます。

char str[64]; 
cin.getline(str, sizeof(str)); 

strlen(str)が1に等しくない場合、エラーがスローされる可能性があります。そうでなければ、str[0]a,bまたはcと比較できます。

scanfループ内の文字列の場合、空白(スペースバーまたは改行文字)で終了する最初の文字セットを返します。次の反復では、次の文字列などを読み込みます。ユーザーが"abc def\n"のようなものを入力した場合、scanfは最初にabcを返し、その後にdefを返します。 cin.getline()を使用すると、改行まで入力されたすべての文字、つまり"abc def"がcin.getline()への最初の呼び出しで返されます。

0

stringを使用する必要はありません。 charscanfと併用すると効果的です。

int main() { 
    char ch; 
    cout << "Type a, b, or c: "; 
    scanf("%c", &ch); 

    while ((ch > 'C' && ch < 'a') || ch > 'c' || ch < 'A') { 
    if (ch >= 'A' && ch <= 'Z') 
     ch += ('a' - 'A'); 
    cout << endl << ch; 
    cout << endl << "Enter a, b, or c: "; 
    scanf("%c", &ch); 
    } 
} 

これはchar chを取得するためにscanfを使用しています。 chara, b, cまたはA, B, Cではない間にループします(大文字の使用例が必要なようです)。 charが大文字の場合、小文字に変換されてcharが出力されます。

+0

'scanf()'はC言語用です。 'std :: cin'、' std :: cout'、 'std :: string'などはC++用です。あなたは本当にCとC++を一緒に混ぜ合わせるべきではありません。 'std :: cin >>は、' std :: cin >> ch'または 'std :: cin.get()'を使って、単一の ''char'入力に対してうまく動作します。 –

+0

私はちょうど示唆scanfに行っていた。私はそれを自分で使ったことはありませんでしたが、それは元々の問題でした。 –

+0

なぜそれらを混ぜ合わせるべきではありませんか? scanfはhttp://www.cplusplus.com/reference/cstdio/scanf/ここでmentinoされていますので、C++でも動作しませんか? – DZD

0

scanf("%s")std::stringを試してみることはできません。 scanf("%s")は、代わりに事前に割り当てられたchar[]を想定しています。あなたがstd::stringを読みたい場合は、代わりにstd::cin.operator>>()またはstd::getline()を使用します。

char enterLetter() { 
    string n; 
    do { 
     std::getline(std::cin, n); 
    } 
    while (n.length() != 1); 
    return n[0]; 
} 

int main() { 
    char ch; 
    do { 
     std::cout << "Type a, b, or c: "; 
     ch = enterLetter(); 
    } 
    while ((ch != 'a') && (ch != 'b') && (ch != 'c')); 

    std::cout << ch; 

    return 0; 
} 
関連する問題