繁体   English   中英

从字符串中使用char的switch语句出现“错误:开关量不是整数”

[英]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语句进行特殊处理以使其快速运行,但是要做到这一点,它需要在编译时知道所有情况。

seqstring * ,而不是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM