开关数量不是整数

时间:2013-12-06 18:18:35

标签: c++ switch-statement

我有这个程序

int main()
{
    string valami = "-- .- .-. -.- ------ -- .- .-. -.-";
    from_morse_string(valami);
    return 0;
}

int from_morse_string(string input_morse_string)
{
    string morse_arr[1764];

    int j = 0;
    stringstream ssin(input_morse_string);
    while (ssin.good() && j < 1764)
    {
        ssin >> morse_arr[j];
        ++j;
    }

    for(int i = 0; i < j; i++)
    {
        switch(morse_arr[i])
        {
            case ".-" : cout << "a" << endl; break;
            case "-..." : cout << "b" << endl; break;
            case "-.-." : cout << "c" << endl; break;
            ...
            case "----." : cout << 9 << endl; break;
            case "-----" : cout << 0 << endl; break;
            default : cout << "it's contain invalid morse code";
        }
    }
    return 0;
}

这是一个简单的摩尔斯电码解码器,一个非常非常简单的程序,但当我想运行时,我收到此错误消息:“切换数量不是整数”

有什么问题?我该如何解决?

6 个答案:

答案 0 :(得分:11)

  

有什么问题?

如错误所示,您只能将switch与整数一起使用,而不是字符串。

  

我该如何解决?

ifelse

if (morse_arr[i] == ".-") {
    cout << "a" << endl;
} else if (morse_arr[i] == "-...") {
    cout << "b" << endl;
} // and so on

或查找表

std::map<std::string, char> morse_map = {
    {".-", 'a'},
    {"-...", 'b'},
    // and so on
};

auto found = morse_map.find(morse_arr[i]);
if (found == morse_map.end()) {
    cout << "invalid morse code\n";
} else {
    cout << found->second << endl;
}

答案 1 :(得分:3)

问题是morse_arrstring的数组,您不能将它们用作switch语句的条件。

使用一系列if / else语句或计算字符串的哈希值并比较它们(可能在交换机中)或其他一些。

答案 2 :(得分:1)

C ++的switchcase语句不支持比较字符串。

比较字符串效率不高。当你有一组固定的字符串值时,我通常会选择使用整数或枚举。

但是,对于您的应用程序,我会使用包含字符串和相应值的查找表。这样效率不高,但代码更少,维护更容易。

答案 3 :(得分:1)

这是一个需要解决的简单问题。

将破折号翻译成字符“1” 将点转换为字符'2' 将该值转换为整数。

在你的case语句中,

将引用的字符串值替换为它将转换为的实际整数。

对案例陈述进行排序,以便首先找到较长的陈述。

不要忘记结肠:“---...”

- ...... ... - de -.- .- ...-- -... - .. - .-

答案 4 :(得分:1)

我想指出你的方法中的一个缺陷。您首先计算所有零件,然后映射每个零件,同时您可以使用迭代方法在发现它时映射每个零件,因此需要更少的存储空间(并且可以无限循环)。

因为这似乎是一个有趣的问题,我决定在这里提出另一种方法:

static std::map<std::string, char> const MorseMap = {
    {".-",    'a'},
    {"-...",  'b'},
    ...
};

void convert(std::istream& morse, std::ostream& regular) {
    std::string buffer;
    while (morse >> buffer) {
        auto const it = MorseMap.find(buffer);
        if (it == MorseMap.end()) { regular << '?'; continue; }

        regular << it->second;
    }
}

是的,works,甚至是你的第五个字符都有太多破折号。

通常,迭代处理需要更少的内存,并且产生更高的响应性,但是它可能使设计复杂化并减慢整体计算;你必须根据具体情况来判断它是否值得。

答案 5 :(得分:0)

字符串数据类型不能用作切换的条件,因为切换仅在可以明确转换为整数的数据类型上正常工作。例如,字符数据类型可以明确地转换为整数,并且整数本身可以用作切换的条件,但是字符串太含糊,无法更改为整数,这就是错误消息弹出的原因。您最好尝试使用其他类似“ if语句”的方法来使程序正常工作。