如何从 C++ 中的 UserInput 字符串为 switch case 分配枚举
How to assign an enum for a switch case from UserInput string in C++
我正在编写这段代码,它接收一个字符 userinput
并使用 switch 语句执行相应的命令。但是因为 C++
switch 语句只能读取整数和枚举,所以我不确定如何合并它。用户输入必须是字符。有任何想法吗?我知道 charInput
>> enumInput
不起作用,但我不确定该怎么做。
int main(int argc, char** argv) {
enum charCommand { i, d, s, n, r, a, m, t, p, l, q };
charCommand enumInput;
while (mainLoop) {
cout << "enter valid input" endl;
char charInput;
printf("Enter a command: ");
cin >> charInput;
charInput >> enumInput;
switch (charInput) {
case i: {
printf("This is case i");
exit(0);
} //case i
default: {
cout << "invalid command, try again!\n";
}
}
};
}
完成此操作的一种方法是将输入的实际字符映射到其对应的 enum
:
#include <map>
//...
int main (int argc, char** argv)
{
enum charCommand {i,d,s,n,r,a,m,t,p,l,q};
std::map<char, charCommand> charToEnumMap = {{'i',i},
{'d',d},
{'s',s}}; // Add the rest
charCommand enumInput;
while (mainLoop)
{
cout << "enter valid input" endl;
char charInput;
printf("Enter a command: ");
cin >> charInput;
auto iter = charToEnumMap.find(charInput);
if ( iter != charToEnumMap.end() )
{
switch (iter->second)
{
case i :
{
printf("This is case i");
exit(0);
} //case i
default:
{
cout << "invalid command, try again!\n";
}
}
}
}
}
这里不需要enum
。 switch
适用于 char,因为 char
可转换为 int
。因此,如果我们这样定义 char
:
char c = 'a';
..然后打开它:
switch (c)
之所以有效,是因为 'a'
可以转换为 int
(ASCII 值)。所以这也可以写成:
switch (int(c)) // Same as switch (c)
示例:
#include <iostream>
int main(int argc, char** argv)
{
char input; std::cin >> input;
switch (input)
{
case 'a':
std::cout << 'a' << std::endl;
break;
case 'b':
std::cout << 'b' << std::endl;
break;
case 'c':
std::cout << 'c' << std::endl;
break;
default:
std::cout << "Some other key" << std::endl;
break;
}
}
上面的例子有效。对于您的情况,我会将您的程序重写为:
#include <iostream>
int main(int argc, char** argv) {
while (true) {
std::cout << "enter valid input" << std::endl;
char charInput;
printf("Enter a command: ");
std::cin >> charInput;
switch (charInput) {
case 'i':
printf("This is case i");
exit(0); //case i
default:
std::cout << "invalid command, try again!\n";
break;
}
};
}
此外,请考虑不要在您的代码中使用以下内容:
using namespace std;
..因为它被认为是一种不好的做法。有关这方面的更多信息,请查找 why is "using namespace std" considered as a bad practice.
我正在编写这段代码,它接收一个字符 userinput
并使用 switch 语句执行相应的命令。但是因为 C++
switch 语句只能读取整数和枚举,所以我不确定如何合并它。用户输入必须是字符。有任何想法吗?我知道 charInput
>> enumInput
不起作用,但我不确定该怎么做。
int main(int argc, char** argv) {
enum charCommand { i, d, s, n, r, a, m, t, p, l, q };
charCommand enumInput;
while (mainLoop) {
cout << "enter valid input" endl;
char charInput;
printf("Enter a command: ");
cin >> charInput;
charInput >> enumInput;
switch (charInput) {
case i: {
printf("This is case i");
exit(0);
} //case i
default: {
cout << "invalid command, try again!\n";
}
}
};
}
完成此操作的一种方法是将输入的实际字符映射到其对应的 enum
:
#include <map>
//...
int main (int argc, char** argv)
{
enum charCommand {i,d,s,n,r,a,m,t,p,l,q};
std::map<char, charCommand> charToEnumMap = {{'i',i},
{'d',d},
{'s',s}}; // Add the rest
charCommand enumInput;
while (mainLoop)
{
cout << "enter valid input" endl;
char charInput;
printf("Enter a command: ");
cin >> charInput;
auto iter = charToEnumMap.find(charInput);
if ( iter != charToEnumMap.end() )
{
switch (iter->second)
{
case i :
{
printf("This is case i");
exit(0);
} //case i
default:
{
cout << "invalid command, try again!\n";
}
}
}
}
}
这里不需要enum
。 switch
适用于 char,因为 char
可转换为 int
。因此,如果我们这样定义 char
:
char c = 'a';
..然后打开它:
switch (c)
之所以有效,是因为 'a'
可以转换为 int
(ASCII 值)。所以这也可以写成:
switch (int(c)) // Same as switch (c)
示例:
#include <iostream>
int main(int argc, char** argv)
{
char input; std::cin >> input;
switch (input)
{
case 'a':
std::cout << 'a' << std::endl;
break;
case 'b':
std::cout << 'b' << std::endl;
break;
case 'c':
std::cout << 'c' << std::endl;
break;
default:
std::cout << "Some other key" << std::endl;
break;
}
}
上面的例子有效。对于您的情况,我会将您的程序重写为:
#include <iostream>
int main(int argc, char** argv) {
while (true) {
std::cout << "enter valid input" << std::endl;
char charInput;
printf("Enter a command: ");
std::cin >> charInput;
switch (charInput) {
case 'i':
printf("This is case i");
exit(0); //case i
default:
std::cout << "invalid command, try again!\n";
break;
}
};
}
此外,请考虑不要在您的代码中使用以下内容:
using namespace std;
..因为它被认为是一种不好的做法。有关这方面的更多信息,请查找 why is "using namespace std" considered as a bad practice.