0

使用以下 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;
    }
}

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

4

7 回答 7

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();
于 2012-06-25T14:42:52.020 回答
4

您正在添加一个整数和一个字符串文字。这在 C++ 代码中并不典型。

可能发生的情况是,您正在返回一个由无效字符指针构造的字符串,因为文字(方式)短于 1100 个字符。

于 2012-06-25T14:42:48.353 回答
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)";
于 2012-06-25T14:45:44.453 回答
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)";
    }
}
于 2012-06-25T14:46:24.587 回答
1

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

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

如果我要尝试将其再偏移一个字符(一个字节,向右偏移一个):

recognise_mti(1100);  // "being initialized."  
recognise_mti(1101); // "eing initialized."
于 2012-06-25T14:51:45.240 回答
0

您不能将整数和字符串文字与+. 您需要先将整数转换为字符串。您可以使用 astringstream或使用sprintf().

于 2012-06-25T14:42:56.880 回答
0

您将 a 添加int到 aconst char*并将其返回为 a string

于 2012-06-25T14:43:01.667 回答