为什么使用cin.get()的C++求和程序可正确识别多位整数?
问题解答
cin.get(char) 每次确实只会读取1个字符,不会一次性读取多个数字字符。这段代码能正确读取多位整数,核心是依靠 cin >> 整数变量 的特性,和 cin.get、cin.putback 本身的读取长度无关。
代码运行的完整流程
我们以输入 Hello please add 12 and 14 ! 为例,一步步看执行过程:
- 第一个循环用来定位第一个整数的开头:
- 循环用
cin.get(ch)逐个读取字符:H、e、l、l、o、空格、p...一直到读到字符1 - 发现
1是数字,就用cin.putback(ch)把这个1放回输入流,此时输入流的读取指针又回到了1的前面 - 接下来执行
cin >> m:cin读取int类型的时候,会自动从当前指针位置开始,连续读取所有连续的数字字符,直到遇到非数字字符为止。所以这里会依次读入1和2,自动拼接成整数12赋值给m,读到后面的空格时停止读取,第一个循环结束。
- 循环用
- 第二个循环用来定位第二个整数的开头:
- 继续从刚才停止的位置(
12后面的空格)开始,用cin.get(ch)逐个读后面的a、n、d、空格,直到读到第二个整数开头的1 - 同样把
1放回输入流,用cin >> n连续读取1和4,得到整数14赋值给n
- 继续从刚才停止的位置(
- 最后忽略当前行剩余的所有字符,输出计算结果。
补充说明
cin.get 和 cin.putback 在这里的作用仅仅是定位到第一个数字字符的位置,把第一个数字还回流里,让后面的cin>>能正常从第一位数字开始读整个整数,真正完成多位整数读取的是cin>>的自带逻辑。
参考代码
#include <iostream> using namespace std; int main(){ int m,n; char ch; while(cin.get(ch)){ if(isdigit(ch)) { cin.putback(ch); cin>>m; break; } } //cin.putback() restores the last character //read by cin.get() back to the input stream while(cin.get(ch)){ if(isdigit(ch)) { cin.putback(ch); cin>>n; break; } } cin.ignore(80,'\n'); cout<<"m + n = "<<m+n<<endl; return 0; }
内容的提问来源于stack exchange,提问作者Vasac
相关产品推荐
相关产品推荐

