[英]Switch statement using char from a string with “Error: switch quantity not an integer”
我相信在C ++的switch语句中,允许您在switch中使用int或char。 就我的目的而言,我想使用一个字符。 我要使用的字符是字符串中的字符。 这是我的功能:
#include <string>
using namespace std;
...
int calindex(string* seq)
{
int index = 0;
for(int i=0;i<seq.length();i++)
{
switch(seq[i])
{
...
}
}
return index; // index is modified within the switch statement
}
但是,当我编译时,出现以下错误:“ switch(seq [i]”)指出“开关量不是整数”。谁能看到我做错了什么?
switch(seq[i])
应该:
switch((*seq)[i])
您忘记了首先取消引用指针。 它正在尝试访问第ith个字符串。 也:
seq.length();
应该:
seq->length();
switch
语句中的case值必须是编译时常量。 switch
语句的重点是要有一种快速,有效的级联if
语句。 编译器会对switch语句进行特殊处理以使其快速运行,但是要做到这一点,它需要在编译时知道所有情况。
seq
是string *
,而不是char *
,因此seq[i]
类型为string
。
在C ++中, string
优先于char数组,同样,引用优先于指针,因此将参数的声明更改为
string &seq
这样string::operator []
可以生效并返回一个(对char
引用)。
(您也可以将 seq
声明为char *
,但这是C而不是C ++ ...)
索引字符串并通过char值切换是正确的,但是问题是您没有索引字符串,而是指向字符串的指针。 然后,您应该取消引用指针,但是为什么不首先使用字符串呢?
您将传递一个指向calindex的字符串指针,但是您将seq视为通过值或引用传递了一个字符串。
为了使switch语句正常工作,您需要通过以下两种方式之一来取消引用指针:
(*seq)[i]
要么
seq->at(i)
请注意,如果您尝试访问不存在的元素,则后者将引发异常,而前者则不会。
这里的问题是通过指针传递的:
int calindex(string* seq)
你为什么不使用:
int calindex(string& seq)
这样更安全。
最重要的是,您不必先检查指针是否为零
通过引用,您不会犯像忽略取消引用这样的简单错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.