cin,scanf后使用getline() 函数的易错点

Posted thesunandsnow

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cin,scanf后使用getline() 函数的易错点相关的知识,希望对你有一定的参考价值。

 
 1 #include <iostream>
 2 #include <string>
 3 #include <cstdio>
 4 #include <ctime>
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     string s, sum;
10     int n;
11     while (scanf("%d", &n) != EOF) {
12         while (n) {
13             getline(cin, s);
14             sum += s;
15             --n;
16         }
17         cout << sum << endl;
18     }
19     
20 
21 }

经过调试发现编译器第一次经过getline()时什么也不做,知道第二次经过getline()时程序才会提示你让你输入s

所以当你输入n时,实际只能再输入n - 1个字符串,改成cin >> s;即可解决这个问题

为什么会这样?

原因链接:https://blog.csdn.net/u011421608/article/details/44591579

原因用户输入完年龄后按回车结束输入,把“ ”留在了输入流里,而cin不会主动删除输入流内的换行符,这样换行符就被getline读取到,getline遇到换行符返回,因此程序不会等待用户输入。

解决办法:把scanf改成cin,在cin后与getline()之间写一句cin.ignore()来忽略换行符

 

以上是关于cin,scanf后使用getline() 函数的易错点的主要内容,如果未能解决你的问题,请参考以下文章

使用 `cin >> n;` 后使用 `getline(cin, s);`

get()与getline()

cin.get() 和 cin.getline() 之间的区别

转 cincin.get()cin.getline()getline()gets()等函数的用法

cin, getline() 与 get() 的区别

cin 详解(get()getline()clear()sync())