【问题标题】:Switch statement using char from a string with "Error: switch quantity not an integer"使用字符串中的字符进行切换语句,并带有“错误:切换数量不是整数”
【发布时间】:2013-07-03 19:39:14
【问题描述】:

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

【问题讨论】:

  • 嗯,我看到的第一个错误是当seq 是指针时使用seq.length()

标签: c++ string char switch-statement


【解决方案1】:
switch(seq[i])

应该是:

switch((*seq)[i])

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

seq.length();

应该是:

seq->length();

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      seqstring *,而不是char *,所以seq[i] 的类型为string

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

      string &seq
      

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

      (您也可以seq 声明为char *,但那是C 而不是C++...)

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

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

          (*seq)[i]
          

          seq->at(i)
          

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

          【讨论】:

            【解决方案6】:

            这里的问题是指针传递:

            int calindex(string* seq)
            

            你为什么不使用:

            int calindex(string& seq)
            

            这样做更安全。

            最重要的是你不必做前提条件来检查指针是否为零

            有了引用,你就不会犯像忽略取消引用这样简单的错误。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-05-19
              • 1970-01-01
              • 1970-01-01
              • 2018-05-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-12-11
              相关资源
              最近更新 更多