0
#include <iostream>
using namespace std;



int main() {

  for (;;) {
    char ch ;
    if (cin.fail()) break;
    cin.read((char*)&ch, sizeof(unsigned char));
    cout<<hex<<(unsigned int)(unsigned char)ch<<endl;
    cin.clear();
  }   
}

为什么这段代码总是a在每一行之后打印?我只是使用任何char作为标准输入。补充:我正在尝试读取未格式化的输入read

4

4 回答 4

3

此代码一次读取一个字符并以十六进制写出该字符的值。

您可能没想到的是,按 Enter 还会发送一个字符,您可以调用cin.read.

a是该字符的十六进制值。因此,如果您键入hello并按Enter,则 cout 语句将产生以下结果:

68
65
6c
6c
6f
a

如果您停止以十六进制显示该值,您会注意到它10在每个条目之后打印。

于 2011-07-01T03:32:14.193 回答
2

您看到的a只是'\n'输入行末尾字符的十六进制值。

如果您不想看到该字符,只需将输出行包装在一个if检查该字符的语句中,并且在看到该字符时不做任何输出:

if (ch != '\n') {
    cout<<hex<<(unsigned int)(unsigned char)ch<<endl;
}
于 2011-07-01T03:35:39.940 回答
1

我什至不知道你想用这个来完成什么。不要cin.read用于读取单个字符。这个循环应该看起来更像这样:

char ch;
while (std::cin.get(ch)) {
    std::cout << std::hex << static_cast<unsigned>(ch) << std::endl;
}

至于为什么打印一些东西,你确定它不是你实际输入的字符吗?

于 2011-07-01T03:25:01.383 回答
1

GargantuChet 已经正确解释了为什么你会得到'a'。

更一般地说,还有许多其他问题

1 for (;;)
2 {
3     char ch;
4     if (cin.fail()) break;
5     cin.read((char*)&ch, sizeof(unsigned char));
6     cout << hex << (unsigned int)(unsigned char)ch < <endl;
7     cin.clear();
8 }

在第 4 行,您会看到是否cin.fail()已设置,但是对于流,它们将永远不会以失败状态启动 - 您必须尝试做一些事情以使其失败。换句话说,您应该read() 看看cin.fail(). 通常,您还应该使用gcount()来检查实际可以读取多少字节(例如,尽管要求说 4,但您可能只会得到 2,这不会被视为失败),但在这里您只请求 1 个字符,所以它可以更简单。

稍微清理一下,但保持相同的基本方法:

1 for (char ch; cin.read(&ch, sizeof ch); )
2     cout << hex << (unsigned)(unsigned char)ch < <endl;

这是有效的,因为read()返回对 的引用cin,并且评估 的“真值”cin是询问到目前为止它执行的输入是否没有错误的简写(更严格地说,至少从最后一次开始,clear()如果你正在使用它)。

尽管如此,std::istream- 其中std::cin是一个实例 - 还具有设计用于获取字符的功能,允许将循环简化为:

for (char ch; std::cin.get(ch); )
    ...

在旁边

请记住,for( ; ; )控制语句包含三个部分:

  • 左侧的初始化代码也可以创建新变量
  • 测试:这发生循环语句的第一次和每次后续执行之前
  • 每次执行语句之后和重复测试之前执行的代码。

正因为如此,像这样的测试std::cin.get(ch)被调用并评估成功作为每次迭代的条件。上面列出的最后一个解决方案等效于:

{
    char ch;
    while (std::cin.get(ch))
        ...
}
于 2011-07-01T04:48:33.697 回答