6

我有这个(不正确的)示例代码,用于从 stringstream 中获取一个值并将其存储在一个字节大小的变量中(它需要在一个单字节 var 中,而不是 int 中):

#include <iostream>
#include <sstream>

using namespace std;

int main(int argc, char** argv)
{
    stringstream ss( "1" );

    unsigned char c;
    ss >> c;

    cout << (int) c << endl;
}

我运行它时的输出是 49,这不是我想看到的。显然,这被视为 char 而不是简单的数值。当转换为 int 时,让 c 保持 1 而不是 49 的最 C++ 方式是什么?

谢谢!

4

5 回答 5

10

最 C++-ish 的方法当然是通过读入另一个整数类型来正确解析值,然后转换为字节类型(因为读入 achar永远不会解析 - 它总是只会读取下一个字符):

typedef unsigned char byte_t;

unsigned int value;
ss >> value;
if (value > numeric_limits<byte_t>::max()) {
    // Error …
}

byte_t b = static_cast<byte_t>(value);

我用过unsigned int,因为这是最自然的,虽然unsigned short当然也可以。

于 2010-07-28T19:34:03.020 回答
3

char 将始终这样做。您需要读取一个 int(或 float 或 double 等),否则将调用错误的“格式化程序”。

unsigned char c;
unsigned int i;
ss >> i;
c = i;
于 2010-07-28T19:32:52.023 回答
2

'0'从中减去:

cout << (int) (c - '0') << endl;

'0'值为 48,因此 49 - 48 = 1

于 2010-07-28T19:29:04.017 回答
0
stringstream ss( "1" );
unsigned char c;
{
    unsigned int i;
    ss >> i;
    c = i;
}
cout << static_cast<int>(c) << endl;

将工作。你也可以做一些不安全的指针的事情,但我会选择上面的。

于 2010-07-28T19:35:42.393 回答
-1

这是因为 C++ 中的字符串常量被视为文本。
两种选择:

  • 使用转义数字对字符串进行编码:

    • 八进制数:\0<d>{1,3}
    • 十六进制数:\0x<d>{2}

    std::stringstream("\01\02\03\04\0xFF");

  • 或者构建一个 char 数组并使用数字对其进行初始化:

    字符数据[] = { 0, 1, 2,3 ,4, 255 };

怎么样:

#include <iostream>
#include <sstream>

using namespace std;

int main(int argc, char** argv)
{
    char x[] = {1,0};
    stringstream ss( x);

    unsigned char c;
    ss >> c;

    cout << (int) c << endl;
}
于 2010-07-28T20:26:12.420 回答