cin内容总结,各种方法和用法的区别
平常练练算法输入都给你安排好了,cin平时随便用用就结束了,后来有的题要自己写输入的时候,发现自己对cin真不会,查了一些内容发现有挺多内容细究起来还挺有迷惑性的,于是写一个汇总备忘。
首先,明确cin是一个对象,和其他的对象一样的。其包括的方法有:
提取运算符(>>):用于从输入流中提取数据,并将数据存储到指定的变量中。
get()方法:用于从输入流中读取一个字符,并返回该字符的ASCII码值。
getline()方法:用于从输入流中读取一行数据,并将该行数据存储到指定的字符串变量中。
ignore()方法:用于忽略输入流中的指定数量的字符。
peek()方法:用于查看输入流中的下一个字符,但不将其从输入流中移除。
putback()方法:用于将一个字符插入到输入流的当前位置之前,以便该字符可以被后续的读取操作读取。
eof()方法:用于检查输入流是否已到达文件末尾。
fail()方法:用于检查输入流是否发生了错误。
clear()方法:用于清除输入流的错误标志,使其可以继续读取数据。
这个看看就行了,需要用的时候自然会。
下面说说cin读数字和读字符的具体流程:
cin读取数字时会一直读忽略所有的空格回车和Tab,直到下一个输入不是数字或者读到文件结束符Ctrl+Z(在屏幕显示的^Z字样,ASCII=26)为止。
使用cin读取字符时,它会读取输入流中的下一个字符,并将其存储在字符变量中。cin不会跳过空格或换行符。
总的来说,当输入流中的下一个字符不是变量类型所需的字符时,提取运算符会停止读取,并将输入流的错误标志设置为failbit。
数字输入
那么好了好了,现在主要讨论一下输入数字的问题,
平时用用一个cin>>a这种谁都会,出问题往往出在想要输入不定数量的数字时,应该怎么输,什么时候结束,怎么结束的问题。
int a,sum;
while(cin>>a)
{
sum=sum+a;
}
cout<<sum<<endl;
你想算三个1相加的和,你在键盘上全部输入包括
1 1 1 ^Z(键盘操作对应Ctrl+Z)再按回车
其实当你按下回车时等于告诉计算机一个行结束符,该行结束符包含了两个字符回车符(CR,ASCII=13)和换行符(LF,ASCII=10),即“\r,\n”。
CR是移动到本行开头,下一面的输入会覆盖本行内容,LF表示此行结束,换到下一行开头,两者结合实现了换行输入的效果。
上文对CR和LF说的是打印机怎么应对行结束符的,网上查的也是这类说法,换这行那行,计算机内部都是纯逻辑概念,有物理的打印头和物理空间上每行的概念给你换行吗?没有。
所以实际到计算机时遇到CR和LF组成的行结束符(也就是敲一下回车)也代表此时才可以将输入的内容全部放进缓冲区了,然后cin才真正开始在缓冲区读取此时的全部输入,上文的例子中全部的输入包括一个1,一个空格,一个1,一个空格,一个1,一个空格,一个^Z,一个空格,最后是一个CR,一个LF
按上文说的现在cin对象应对的是int类型,遇到第一个不是数字的字符为止,所以第一个1输进去了,遇到一个空格,说明此时的1已经结束了,判断循环条件为true,赋值给a,并执行循环体。就这样把三个1全部加进sum里了,再然后读到了^Z,文件结束,执行输出,程序结束。
那么有一个问题了,到^Z就结束,缓冲区后面不是还有一个空格,一个CR,一个LF吗,剩下三个字符怎么安排的?没错,确实有。
下面再用一个实际中很可能用的情况说明:
现在要求先输入一个不定数量value,输完了之后再要求输入一个b,让sum-b。
我这里注释掉 了cin.clear();看看是什么情况
int main()
{
int value, sum = 0,b;
while (cin >> value)
{
sum = sum + value;
}
//cin.clear();
cin >> b;
sum = sum - b;
cout << "sum=" << sum;
return 0;
}
在键盘依次输入如下内容,表示先输入3个value,待会再输入b:
1 2 3 ^Z 回车
结果如下,b还没输入呢,程序运行完了,sum还是一个不知道什么数,错到家了。
这就是因为缓冲区里还剩行结束符的几个字符,自动被cin>>b读取了,然而b是int类型,读到控制字符了,甚至不是普通的字母字符,于是就乱了。
解决方法是加上一行代码cin.sync()和cin.clear(),只加cin.clear()也会有问题,就不细说的了,会有什么问题就扣的太细节了,下面贴的文章有详细说明
int main()
{
int value, sum = 0,b;
while (cin >> value)
{
sum = sum + value;
}
cin.sync()
cin.clear();
cin >> b;
sum = sum - b;
cout << "sum=" << sum;
return 0;
}
clear()和sync()具体有什么区别,可以参考这篇文章。
https://blog.csdn.net/ghost_zc/article/details/93767166
字符输入
关于字符输入的问题主要包括getchar(),getline(),cin.getline(),cin.get()这四个内容。这四个玩意长得这么像,平时又能看到各种混着用,不自己费心总结一下,确实分不出来。
首先是getchar(),cin是没有getchar()方法的,但是又有人爱这么用,所以有时还能看到这东西,很烦。cin没有是因为getchar是C语言的库函数,作用是只读取一个字符,并返回它的ASCII,效果等于C++的get(),区别是一个用法是char a=getchar(),一个是char a=cin.get()。
所以,getchar()和cin.get()是读字符的。
说回getline,经常会看到getline和cin.getline()的用法,有什么区别呢?
一句话说明呢就是 getline()函数适用于读取C++字符串对象(即std::string)中的数据,而cin.getline()方法适用于读取C风格字符串(即char数组)中的数据。
说的详细点就是:
getline()函数是C++标准库中的一个函数,定义在<sstream>头文件中,其函数原型为:getline(istream& is, string& str, char delim)。其中,is表示输入流对象,str表示存储读取数据的字符串对象,delim表示行结束符,通常为换行符(默认值为\n)。该函数从输入流中读取数据,直到遇到行结束符为止,并将读取到的数据存储到指定的字符串对象中。
cin.getline()是C++标准库中的一个方法,定义在istream类中,其函数原型为:istream& getline(char* s, streamsize n, char delim)。其中,s表示存储读取数据的字符数组,n表示字符数组的大小,delim表示行结束符,通常为换行符(默认值为\n)。该方法从输入流中读取数据,直到遇到行结束符为止,并将读取到的数据存储到指定的字符数组中。
所以另一个角度解释可以说,一个是标准库函数,一个类方法。
那么好了好了,也许又有人问了,cin.get(),cin.getline(),getline()在是否添加行结束符有什么区别
下面的代码将读取一行文本,包括行结束符:
char str[100];
cin.get(str, 100);
下面的代码将读取一行文本,但不包括行结束符:
char str[100];
cin.getline(str, 100);
下面的代码将读取一行文本,但不包括行结束符
string str;
getline(cin, str);
总结,除了cin.get()会读取行结束符,另外两个不会。
CSDN-Ada助手: 推荐 算法 技能树:https://edu.csdn.net/skill/algorithm?utm_source=AI_act_algorithm
CSDN-Ada助手: 恭喜你写了第12篇博客!对Unity事件和委托有了更深入的理解,这是非常不易的。接下来,我建议你可以尝试深入探讨一些实际案例,或者结合一些其他相关的技术进行更深入的探讨,这样可以让读者更好地理解和运用这些知识。加油!期待你更多的精彩内容。
94994: 这个库可以可视化一维的卷积层吗
CSDN-Ada助手: 非常感谢你的分享!恭喜你写了第13篇博客,并且标题看起来非常吸引人。能够亲自测试并找出Tensorflow-gpu版本的匹配组合,无疑会为很多人节省不少时间和精力。希望你能继续保持创作的热情,分享更多有关Tensorflow-gpu的经验和技巧。也许下一步你可以探索一些高级应用或者实践案例,向读者们展示如何在实际项目中充分利用Tensorflow-gpu的优势。期待你的下一篇博客,再次感谢你的分享!
不会真有人是二次元吧: 不需要,通道不存在大概率是在配置vs code里的ssh时端口号或者主机ip地址有错误,建议询问服务器管理员