在 C++ 中使用 char 变量执行 switch 语句

switch statement over performing with char variable in c++

#include<iostream>

using namespace std;

void fun() {
   while(1) {
      char choice;
      cout<<"(D)isplay, (E)xit"<<endl;
start:
      cout<<">> ";
      cin>>choice;
      switch(choice) {
         case 'd':
         case 'D':
            cout<<"hello world"<<endl;
            break;
         case 'e':
         case 'E':
            return;
         default:
            cout<<"INVALID!"<<endl;
            goto start;
      }
   }
}
int main() {
   system("clear");
   fun();

   return 0;
}
            

这是一个简单的c++程序。 我面临以下问题:

(D)isplay, (E)xit
>> mnop
INVALID!                                                  
>> INVALID!                                               
>> INVALID!
>> INVALID!
>>

符号“>>”提示用户输入一个字符并给出适当的结果,但如果输入一个字符串,它的行为类似于这样。我想知道为什么会发生这种情况以及如何阻止它:)

尝试在获取您的值后调用 cin.clear(),也可能 cin.ignore(INT_MAX)。这将为您清除缓冲区。

您正在接受用户输入的字符。 Char 仅表示一个字符,因此如果您输入一个字符串,如“mnop”,则其中有四个字符。每个都被视为单独的输入,因此您会得到“无效!”四次。

一种解决方案是获取字符串输入并首先检查该输入的长度。如果它大于 1,则忽略它,否则检查它是 'D' 还是 'E'.

您也可以使用 getch() 函数。它限制用户只能输入一个字符。

#include <stdio.h>
#include <conio.h>
char ch = getch();

您的代码按照您的指示执行,但不会更多:cin>>choice; 读取单个字符。当用户键入多个字符时,其他字符将留在流中,并在下一次调用时读取。

如果您想正确处理多个字符的输入,那么您需要从流中提取多个字符。例如:

 while (true) {
     std::string input;
     std::cin >> input;
     if (input.size() > 1 || input.size() == 0) {
         std::cout << "enter only a single character\n";
     } else {
         choice = input[0];
         break;
     }
} 

或者,您可以在读取一个 and/or 后检查流中是否还有更多字符,只需丢弃它们(通过 ignore)。

cin >> choice ,您只读了一个字符。剩余的字符保留在缓冲区中,并在您再次调用 cin >> choice 时读取。试试 string asdf 然后你会看到输出。

您可以使用 cin.read();

刷新 std 或简单地读取所有剩余的字符

通过读取所有字符基本上清除输入缓冲区。