0

我需要重载流提取运算符。我需要通过允许用户在提示符下输入字符串来做到这一点,比如“iamastring”,然后操作员将从字符串中提取每个字符并测试它是否是空格以及是否不是空格存储它在一个字符数组中,然后传递给一个对象。

@Chip 等人。例如输出我不希望它向屏幕输出任何内容。相反,在用户输入字符串并点击输入后,应再次提示用户输入新的菜单选择。就目前而言,用户输入一个字符串按回车键,然后显示“错误读取错误”,提示又回来等待新的输入。

4

3 回答 3

3

你有什么理由不使用 std::string 和 std::getline 吗?在编写自己的提取运算符之前,您应该三思而后行 - 格式化输入并不是 C++(或 C 的一个特别有用的特性)。

于 2009-12-06T19:32:05.287 回答
3

这很有趣 - 你的名字和我的名字一样,但是颠倒了:)

怎么样:

char buffer[buffSize+1]; // no need for dynamic allocation here
unsigned i = 0;
while(std::cin && !std::isspace(std::cin.peek()) && i < buffSize)
  buffer[i++] = std::cin.get();
buffer[i] = '\0'; // null termination can be important.
// i now contains the length btw

这完全是您自己的代码,只是进行了一点重构-我删除了所有不必要的东西等,仅此而已..

编辑:现在已修复以验证流状态并防止堆栈溢出:)

编辑二:将 std::cin.good() && !std::cin.eof() 更改为 std::cin。顺便说一句:为什么 cin 转换为 void* 而不是 bool?

于 2009-12-06T20:43:09.233 回答
1

无论如何,代码被破坏了。它不处理输入失败,这可能是致命的,因为您的代码可以进入无限循环。如果封装流读取操作,则必须注意测试流是否处于有效状态。

于 2009-12-06T20:56:55.373 回答