C ++在switch中使用int时非常奇怪的行为

时间:2012-06-25 14:40:04

标签: c++ int switch-statement case

我使用以下switch语句获得了一些非常奇怪的行为:

string recognise_mti(int mti_code)
{
switch(mti_code)
    {
    case 1100:
    case 1101:
        return (mti_code + " (Auth. Request/Repeat)"); break;

    default:
        return (mti_code + " (NOT RECOGNISED)"); break;
    }
}

似乎根据输入整数返回各种各样的东西。它可能会变成一个愚蠢的错误,但到目前为止,我无法识别它。感谢任何帮助。

7 个答案:

答案 0 :(得分:10)

mti_code" (Auth. Request/Repeat)"都不是std::string。所以实际上,所有添加的内容都是指针添加。因此,您最终会得到一个随机(可能无效)的指针,然后将其隐式转换为std::string

试试这个:

#include <sstream>

...

std::stringstream ss;
ss << mti_code;
switch(mti_code)
    {
    case 1100:
    case 1101:
        ss << " (Auth. Request/Repeat)"; break;

    default:
        ss << " (NOT RECOGNISED)"; break;
    }
return ss.str();

答案 1 :(得分:4)

您正在添加整数和字符串文字。这在C ++代码中并不完全是典型的。

可能发生的是你返回一个由无效字符指针构成的字符串,因为文字是(方式)短于1100个字符。

答案 2 :(得分:2)

您正在尝试将一个整数添加到C风格的字符串中,这不符合您的预期。该字符串被转换为指向其第一个字符的指针,然后该指针将增加1100(或其他)字节,从字符串的末尾开始,并进入随机存储器。如果你很幸运,程序会崩溃;如果你运气不好,那么该函数将返回垃圾。

您可以使用字符串流来构建字符串:

std::ostringstream result;
switch(mti_code)
{
case 1100:
case 1101:
    result << mti_code << " (Auth. Request/Repeat)"; break;

default:
    result << mti_code << " (NOT RECOGNISED)"; break;
}
return result.str();

或在C ++ 11中,您可以使用std::to_string转换整数:

return std::to_string(mti_code) + " (Auth. Request/Repeat)";

答案 3 :(得分:2)

您正尝试将字符串附加到整数。这在C或C ++中是不可能的。你必须以某种方式将整数转换为字符串,std::ostringstream是推荐的方式:

std::string recognise_mti(const int mti_code)
{
    std::ostringstream ostr;

    switch(mti_code)
    {
    case 1100:
    case 1101:
        ostr << mti_code << " (Auth. Request/Repeat)";
        break;

    default:
        ostr << mti_code << " (NOT RECOGNISED)";
        break;
    }

    return ostr.str();
}

或者如果你有一个支持C ++ 11和std::to_string的编译器,你可以使用它:

std::string recognise_mti(const int mti_code)
{
    switch(mti_code)
    {
    case 1100:
    case 1101:
        return std::to_string(mti_code) + " (Auth. Request/Repeat)";

    default:
        return std::to_string(mti_code) + " (NOT RECOGNISED)";
    }
}

答案 4 :(得分:1)

您确实看到要将一个整数值添加到给定字符串文字的第一个字节的地址中吗?这基本上是未定义的行为,因为你正在做一个偏移,比方说1100到“右”(因为我们正在谈论字符,这是位于内存街道1100字节的东西的地址)。例如,在我的示例中,如果我尝试将给定的字符串文字地址偏移1100,则会“初始化”。那是因为偏移地址被返回并被隐式转换为一个字符串,该字符串被读取为位于给定地址的任何内容。

可以是任何东西,我的示例字符串,“疯狂的大象”或在MSVC中启用完整C ++ 11支持的秘密方式。 :P

如果我试图将它再偏移一个字符(一个字节,右边一个偏移量):

recognise_mti(1100);  // "being initialized."  
recognise_mti(1101); // "eing initialized."

答案 5 :(得分:0)

您不能将整数和字符串文字与+连接起来。您需要先将整数转换为字符串。您可以使用stringstreamsprintf()

执行此操作

答案 6 :(得分:0)

您正在向int添加const char*并将其作为string返回。