1、通常仅仅使用cin去读取用户输入的字符串会有一个问题:
问题:就是输入字符串中有空格,只输出空格之前的字符,之后的字符会存在输入队列中,留给下一次cin输入使用。这就导致下一次cin时,用户不能主动输入就给被动完成了输入。如下例子所示:输入123 45,直接输出123;后面的45留在系统的输入队列中,如果下面紧接着加上一行输入代码,那么45会直接被输出,我们还没来得就反应,就被动输出了。不行可以试试。
// 输入一行字符串
char str[20];
cout << "输入一行字符串:";
// 这样输入是存在问题的,
// 就是输入字符串有空格,只输出空格之前的字符,之后的字符在输入队列中,留给下一次输入变量。
cin >> str;
cout << str << endl;
// 运行结果如下:
// 输入第一行字符串:123 45
// 123
// 请按任意键继续. . .
我测试了一下,代码如下,输入123 45后,系统不久输出123,而且还自动输出45,我们没有第二次输入的机会。
char str[20];
char tmp[20];
cout << "输入一行字符串:";
// 这样输入是存在问题的,
// 就是输入字符串有空格,只输出空格之前的字符,之后的字符在输入队列中,留给下一次输入变量。
cin >> str;
cout << str << endl;
cin >> tmp;
cout << tmp << endl;
//运行结果如下:
//输入一行字符串:123 45
//123
//45
//请按任意键继续. . .
解决方法:使用getline() or get()
下面使用getline(),getline不会在输入队列中保留输入的换行符,完美避免换行符对下一次输入的影响。
输入123 45后,直接原样输出123 45。说明getline的确奏效哦。
// 通过getline函数(get也行,只是保留换行符在输入队列中)解决含有空格输入的字符串情况
char str[20];
cout << "输入一行字符串:";
cin.getline(str, 20);
cout << str << endl;
//运行结果如下:
// 输入第一行字符串:123 45
// 123 45
// 请按任意键继续. . .
使用get()方法:通过get输入还会存在换行符保留在输入队列中,避免这种情况,需要使用get()函数无参版本,即cin.get(); 可以直接读取下一个用户输入的字符,不会使用之前存储在输入队列中的换行符。
下面是未使用get()函数无参版本,换行符对第二次输入影响很明显,直接空字符串输出。
char str[20];
char tmp[20];
cout << "输入第一行字符串:";
cin.get(str, 20);
cout << str << endl;
cout << "输入第二行字符串:";
// 还没开始手动输入,就直接输出换行符了,是因为上次输入保留了换行符在输入队列中导致的。
cin.get(tmp, 20);
cout << tmp << endl;
// 运行结果如下:
// 输入第一行字符串:12345
// 12345
// 输入第二行字符串:
// 请按任意键继续. . .
下面使用了get()函数无参版本,可以有效避免换行符的影响,用户可以二次手动输出字符串了。
char str[20];
char tmp[20];
cout << "输入第一行字符串:";
cin.get(str, 20);
cout << str << endl;
cin.get(); //跳过换行符,要准备读取下一个字符。
// 或者可以直接 cin.get(str, 20).get();
cout << "输入第二行字符串:";
// 可以手动输入了。
cin.get(tmp, 20);
cout << tmp << endl;
// 运行结果如下:
// 输入第一行字符串:12345
// 12345
// 输入第二行字符串:67890
// 67890
// 请按任意键继续. . .
2、混合输入数字与字符串情况:
在输入数字后,cin将回车换行符留在输入队列中了,下一次还没输入字符串就直接被当成空串输出了。
解决办法在后面加上get()无参版本, 就可以直接读取下一个数据。
// 问题演示
int a;
char str[20];
cout << "输入数字:";
// 在输入数字后,cin将回车换行符留在输入队列中了,下一次还没输入字符串就直接被当成空串输出了。
// 解决办法在后面加上get(),直接读取下一个数据。
cin >> a;
cout << a << endl;
cout << "输入字符串:";
cin.get(str, 20);
cout << str << endl;
//运行结果如下:
//输入数字:12
//12
//输入字符串:
//请按任意键继续. . .
// 解决方案
int a;
char str[20];
cout << "输入数字:";
// 在输入数字后,cin将回车换行符留在输入队列中了,下一次还没输入字符串就直接被当成空串输出了。
// 解决办法在后面加上get(),直接读取下一个数据。
cin >> a;
cout << a << endl;
cin.get(); // or (cin >> a).get(); or (cin >> a).get(ch); ch为char类型变量
cout << "输入字符串:";
cin.get(str, 20);
cout << str << endl;
//运行结果如下:
//输入数字:12
//12
//输入字符串:string
//string
//请按任意键继续. . .