用了那么久的c++,都没有深入去学习一下c++的标准输入流(cin),标准输出流的(cout)的用法,一般只是简单的使用去获取一个字符串或者几个整型输入。但是发现如果遇到了比较复杂的输入,这简单的三板斧就不够用了,需要考虑空白符(空格,tab,换行符等)的影响。而c++又提供了cin.get,cin.getline,std::getline,等不同的类方法和全局函数,没深入的了解的咋一看就有点晕,这几个函数到底有啥区别?又有哪些坑?
首先可以推荐一下参考这篇博文,说的也比较详细了:(30条消息) std::cin使用_mayue_csdn的博客-CSDN博客
下面是我自己的一些补充。
1、可以利用cin.peek()函数判断是否结束输入
例如这样的场景,需要输入多行,第一行为多个整型数据,直到遇到换行结束,需要存入一个vector中
vector<int> numbers;
while (std::cin >> number) {
numbers.push_back(number);
if (std::cin.peek() == '\n') {
break;
}
}
peek() 函数窥视输入流中的下一个字符,但是不取出,可以通过这个判断下一个字符是否是换行符
2、std::cin返回值
关于cin的返回值,如果读取没有错误,cin返回true,如果读取失败,返回false,例如:
int num;
while (std::cin >> num)
{}
输入:123 aaa
在上面的例子中,在读取到第二个数字时,因为aaa是非数字,因此无法转换城int,cin返回false,跳出循环
3、cin读取标准输入的时候,默认会过滤掉空白字符(如空格 TAB 回车),如果不想过滤空白字符,需要使用std::noskipws,如:
stringstream ss;
cout << "输入字符串:";
char ch;
while (std::cin >> ch)
{
ss << ch;
if (cin.peek() == '\n') {break;}
}
cout << ss.str() << endl;
输入:123 456
输出:123456
以上为cin默认行为,会默认忽略”123 456“之间的空格符
stringstream ss;
cout << "输入字符串:";
char ch;
while (std::cin >> std::noskipws >> ch)
{
ss << ch;
if (cin.peek() == '\n') {break;}
}
cout << ss.str() << endl;
输入:123 456
输出:123 456
以上例子,因为使用了noskipws,就会读取到”123 456“之间的空格符
4、std::istringstream类
std::istringstream,跟std::cin的行为很像,不同的是,cin是从标准输入读取数据,而istringstream是从字符串中读取数据,如下面的例子:
int main() {
std::string str = "123 46 444";
std::istringstream iss(str);
std::vector<int> vec;
int num;
while (iss >> num) {
vec.push_back(num);
}
for (int n : vec) {
std::cout << n << ' ';
}
std::cout << '\n';
}文章来源:https://www.toymoban.com/news/detail-479116.html
上面的例子是从字符串中读取输入,然后把三个数字存入vector中文章来源地址https://www.toymoban.com/news/detail-479116.html
到了这里,关于std::cin C++标准输入流的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!