如何在c++中使用字符串
How to use a string in a case c++
我想使用case "name"
。
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
if(*arg1)
{
switch(LOWER(*arg1))
{
case 'anime':
{
}
break;
}
}
当我调用命令do_reload anime
时不工作。CCD_ 3是主函数,CCD_。如果我使用case 'a'
,它可以完美地工作,但当我使用case 'anime'
时,什么都不会发生。为什么这样?
正如其他人所说,不能在case
语句中使用文本文本。
您的替代方案是:
- 具有文本指针和函数指针的查找表
- 具有函数指针的CCD_ 8
- if/else-if/else梯形图
注意:std::map
或查找表的一个问题是,所有函数都必须具有相同的签名。C++语言不允许在std::map
或结构(查找表(中使用不同类型的函数指针
我假设您打算对字符串文字使用双引号""
,就像对char
使用单引号一样。
开关需要能够从积分(即可枚举(常数的选择中选择匹配条件。字符串文字,如"anime"
,可以归结为保留内存中的const char
数组,char*
指针可以分配给该数组。但是,比较两个字符串只有通过比较它们的内容而不是指针地址才有意义。您可能会创建一个动态字符串,其内容与字符串文字相同,但地址不同。由于这种模糊性,您不能在开关中使用字符串。
您应该使用if-else梯形图,或适合您需要的数据结构,如std::map
。
switch
中的表达式和case
值只能是整型。
字符串文字不是整型。
单个字符(如'a'
(属于整数类型。文字'anime'
(尽管它没有意义(是一个多字符文字,它也有一个整型。
来自C++switch statement
文档:
condition-整型或枚举类型的任何表达式,或上下文隐式转换为整型或枚举型的类类型的表达式,或具有大括号或等于初始值设定项的此类类型的单个非数组变量的声明。
我现在找不到正式的文档,但C
语言也是如此。所以答案是否定的,在C++
和C
中都不能这样做
您可能对这个SO问答感兴趣——为什么switch语句不能应用于字符串?
不幸的是,您无法在C++中打开字符串。
因为有太多的答案说你不能,我要告诉你——你当然可以!当然还有一些注意事项。
constexpr unsigned long encode_(unsigned long in, const char* s)
{
return *s ? encode_((in << 8) | s[0], s + 1) : in;
}
constexpr unsigned long encode(const char* s)
{
return encode_(0, s);
}
constexpr unsigned long operator"" _x(const char* s, long unsigned len)
{
return encode(s);
}
int main(int argc, char **argv)
{
auto x = "hello"_x;
switch (x)
{
case "ola"_x:
break;
case "hello"_x:
break;
}
}
这个代码的作用是将字符串名称的字符填充到一个长整数中。此解决方案只能保证适用于64位系统上最多8个字符的字符串。在那之后,编码的数字就不能保证是唯一的。为了防止无意中使用较长字符串,我建议检查用户定义的文字函数中的len参数,如果使用较长字符串则会导致编译错误。或者,您可以稍微调整代码,并要求每个字符串的前8个字符必须是唯一的。
将我的代码扩展到每个小写英文字符5位的大小写应该相对容易,以将可以使用的字符串长度从8增加到13。
Shannon表明,英语在普通文本中每个字母使用0.6到1.3位。因此,64位整数可能存储大约64个字符的字符串。这样一个压缩函数作为constexpr函数并不容易编写,但它将是一个有趣的练习。