我是C++的新手,并且一直在学习这样的东西:
cout << "My age is: "; cin >> age;
和cin一起乱搞,我遇到了障碍.
说我想写"我已经x岁了!".
"x"是cin >>年龄;
我写这样的代码.
cout << "I am "; cin >> age; cout << "years old!";
障碍是这会产生换行符.
我不希望换行.
我怎么能把这一切留在一条线上?
我假设您实际上希望输入与最终输出一致.否则,解决方案是微不足道的:首先读取值然后打印它,例如:
std::cout << "how old are you? "; std::cin >> x; std::cout << "I am " << x << " years old\n";
处理与输出一致的输入有点棘手.这里的问题是控制台处理实际上是由系统完成的,而不是由语言完成的.因此,在输入数据时必须等待换行.换行符将由控制台处理并创建换行符.要禁用此行为,必须依赖于控制台行为.没有标准的C++方法.
我不知道如何在Windows上处理控制台控件:我主要是UNIX程序员.在UNIX系统上,您使用tcgetattr()
并将tcsetattr()
输入模式设置为非规范(即清除该ICANON
位).所需的文件描述符只是标准输入的描述符,即0
.
一旦控制台使用非规范模式,所有按键都会立即转发到应用程序,并且不会进行屏幕回显.结果,读取功能实际上需要回显单个字符,然后转发到解析功能.做最简单的方法是创建一个过滤流缓冲区,做必要的呼应std::cin
,以std::cout
在转发的字符.然而,将所有这些放在一起是一项工作......
在烹饪演示时,我注意到我还需要处理回声(当用户使用回车键时避免换行).重置控制台标志也很重要,因为即使在程序终止后,它们中的一些实际上仍保持更改.将这些位放在一起但仍缺少错误处理的实现可能如下所示:
#include#include #include struct non_canon_buf : std::streambuf { char buffer; non_canon_buf() { termios flags = {}; tcgetattr(0, &flags); flags.c_lflag &= ~(ICANON | ECHO); tcsetattr(0, TCSANOW, &flags); } ~non_canon_buf() { termios flags = {}; tcgetattr(0, &flags); flags.c_lflag |= ICANON | ECHO; tcsetattr(0, TCSANOW, &flags); } int underflow() { if (std::cin.get(buffer)) { this->setg(&buffer, &buffer, &buffer + 1); if (!std::isspace(static_cast (buffer))) { std::cout << buffer << std::flush; } return std::char_traits ::to_int_type(buffer); } return std::char_traits ::eof(); } }; int main() { non_canon_buf sbuf; std::istream in(&sbuf); std::cout << "I am "; int age = 0; in >> age; std::cout << " years old\n"; if (!in) { std::cout << "ERROR: failed to enter a valid age!\n"; } }
cin
在换行符输入控制台后读取输入.
因此,您可以连续执行此操作的唯一方法是提示用户他们的年龄,然后继续编写它.
例如:
std::cout << "Enter your age> "; std::cin >> age; std::cout << "I am " << age << " years old" << std::endl;
unsigned int age; std::cin >> age; std::cout << "I am " << age << " years old!" << std::endl;
你不能在纯C++中做你想做的事.您可以像其他人一样建议并重新打印该行:
std::cout << "I am " << age << " years old!\n"
或者您可以使用特定于操作系统的功能来清除控制台输出.在这里阅读这个.
例如,您可以使用system("cls");
Windows,在询问用户年龄后清除控制台.
#includeint main(int argc, char* argv[]) { unsigned int age; std::cout << "My age is: " std::cin >> age; system("cls"); std::cout << "I am " << age << " years old!\n" ... }
产量:
C:>AgeProgram.exe I am 10 years old