如何在C++中的字符串之间使用cin
How do I use cin between strings in C++?
我是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 oldn";
处理与输出一致的输入有点棘手。这里的问题是控制台处理实际上是由系统完成的,而不是由语言完成的。因此,在输入数据时需要等待换行符。换行符将由控制台处理并创建换行符。要禁用此行为,必须解决依赖控制台行为的问题。没有标准的C++方法可以做到这一点
我不知道如何处理Windows上的控制台控件:我主要是一名UNIX程序员。在UNIX系统上,您可以使用tcgetattr()
和tcsetattr()
将输入模式设置为非规范模式(即清除ICANON
位)。所需的文件描述符只是用于标准输入的描述符,即0
。
一旦控制台使用非规范模式,所有按键都会立即转发到应用程序,并且不会进行屏幕回显。因此,读取函数实际上需要回显各个字符,然后转发到解析函数。最简单的方法是创建一个过滤流缓冲区,在转发字符时对std::cin
到std::cout
进行必要的回显。然而,把所有这些放在一起是一项艰巨的工作。。。
在制作演示时,我注意到我还需要处理回显(以避免用户使用回车键时出现换行符)。重置控制台标志也很重要,因为即使在程序终止后,其中一些标志实际上仍保持更改状态。一个将比特组合在一起但仍然缺乏错误处理的实现可能看起来像这样:
#include <iostream>
#include <ctype.h>
#include <termios.h>
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<unsigned char>(buffer))) {
std::cout << buffer << std::flush;
}
return std::char_traits<char>::to_int_type(buffer);
}
return std::char_traits<char>::eof();
}
};
int main()
{
non_canon_buf sbuf;
std::istream in(&sbuf);
std::cout << "I am ";
int age = 0;
in >> age;
std::cout << " years oldn";
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");
For Windows,在询问用户的年龄后清除控制台。
#include <stdlib.h>
int 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
你可以这样做
int user_age;
std:cout<<"Enter Your Age:" //Ask user for age
std::cin >>user_age; //Read user input
std::cout<<"I am"<<user_age<<"years old!"<< std::endl; //finlly display the value
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- 在cuda线程之间共享大量常量数据
- C++中的cin.ignore()函数不适用于整个流
- 在c代码之间共享数据的最佳方式
- Mix_Init和Mix_OpenAudio SDL之间的区别是什么
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- 为什么我的 cout 一次执行,尽管 cin 应该在两者之间读取?
- STD :: cin和Scanf()应用于字符串之间的区别
- (m = cin.get())!=EOF&m = cin.get()!=EOF 之间的差异
- cin.ignore(1)之间的分歧是什么?和cin.ignore(n)
- 我创建的c++istream对象和cin之间的区别在哪里,它在库中的可见位置在哪里
- 字符数组的 cin 和 cin.get() 之间的区别
- 如何避免cin.operator>>和getline之间的冲突?
- 使用函数在cin和ifstream之间切换
- 是cin.clear()和cin.ignore()之间必需的序列
- cin.ignore 和 cin.sync 之间的区别
- 如何在C++中的字符串之间使用cin
- cin和作业之间的差异
- ifstream打开由cin命名的文件,但从数组中提取时不打开.cin和常规字符串定义之间的任何区别