0

在 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]”,说明“开关数量不是整数”。谁能看到我做错了什么?

4

6 回答 6

3
switch(seq[i])

应该:

switch((*seq)[i])

你忘了先取消引用指针。它正在尝试访问第 i 个字符串。还:

seq.length();

应该:

seq->length();
于 2013-07-03T19:42:14.450 回答
1

语句中的 case 值switch需要是编译时常量。语句的重点switch是要有一种快速、高效的级联if语句。编译器对 switch 语句做了一些特殊的事情以使其更快,但要做到这一点,它需要在编译时知道所有情况是什么。

于 2013-07-03T19:43:26.803 回答
0

seq是 a string *,不是 a char *,所以seq[i]有 type string

在 C++ 中,string优先于 char 数组,同样,引用优先于指针,因此将参数的声明更改为

string &seq

这样string::operator []才能生效并返回一个 (reference to) char

(您也可以声明seqchar *但那是 C 而不是 C++...)

于 2013-07-03T19:41:33.197 回答
0

索引字符串并通过 char 值切换是正确的,但问题是您没有索引字符串,而是指向字符串的指针。那么你应该取消引用指针,但你为什么不首先使用字符串呢?

于 2013-07-03T19:43:06.980 回答
0

您将字符串指针传递给 calindex,但您将 seq 视为通过值或引用传递字符串。

为了使您的 switch 语句工作,您需要以以下两种方式之一取消引用指针:

(*seq)[i]

或者

seq->at(i)

请注意,如果您尝试访问不存在的元素,后者将引发异常,前者不会。

于 2013-07-03T19:44:20.873 回答
0

这里的问题是通过指针传递:

int calindex(string* seq)

你为什么不使用:

int calindex(string& seq)

这样做更安全。

最重要的是你不必做一个先决条件来检查指针是否为零

通过引用,您不会犯像忽略取消引用这样简单的错误。

于 2013-07-03T19:44:48.663 回答