我有这个程序
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;
}
这是一个简单的摩尔斯电码解码器,一个非常非常简单的程序,但当我想运行时,我收到此错误消息:“切换数量不是整数”
有什么问题?我该如何解决?
答案 0 :(得分:11)
有什么问题?
如错误所示,您只能将switch
与整数一起使用,而不是字符串。
我该如何解决?
if
和else
:
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_arr
是string
的数组,您不能将它们用作switch语句的条件。
使用一系列if / else语句或计算字符串的哈希值并比较它们(可能在交换机中)或其他一些。
答案 2 :(得分:1)
C ++的switch
和case
语句不支持比较字符串。
比较字符串效率不高。当你有一组固定的字符串值时,我通常会选择使用整数或枚举。
但是,对于您的应用程序,我会使用包含字符串和相应值的查找表。这样效率不高,但代码更少,维护更容易。
答案 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语句”的方法来使程序正常工作。