马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 一叶枫残 于 2021-2-8 18:00 编辑
cin.get与cin.getline
对于这个函数
一.当作用于单个字符的变量时,它只会读取一个字符,例如#include <iostream>
using namespace std;
int main()
{
char a;
a = cin.get();
cout << a << endl;
return 0;
}
下面是各种输入情况:
(1)输入一个字符,例如数字,字母,或者符号(英文输入状态下)
这个字符就会赋值给a,cout可以正常输入;
(2)输入多个字符,
只会取输入的第一个字符赋值给a,cout无法把输入的多个字符输出,只能输出赋值的第一个字符;
(3)输入中文或者中文下的标点符号
cout无输出;
对于(3)的情况,经过调试后发现,当输入不同中文和不同的中文符号时,a的ascii码值由初始的0变为负数,这个情况和c语言下时一样的,对于中文的字符和标点符号只能用字符串来储存;
对于这个程序,a = cin.get()还可以改为作用是相同的
二.当作用于字符串时#include <iostream>
using namespace std;
int main()
{
char a[15];
cout << "请输入内容:" << endl;
cin.get(a,10);
cout << "a:" << a << endl;
return 0;
}
注意:这里的cin.get(a,10)不能写成a = cin.get() 或者 cin.get(a),否则编译器会报错
不同情况的输入对应的输出
情况1:请输入内容:
0123456789abcd
a:012345678
情况2:
把cin.get(a,10)改为cin.get(a,20),此时的允许写入的长度已经超过原来的20:
情况3:请输入内容:
0123456789abcdefghijklmn
a:0123456789abcdefghi
对于情况3,我们用以下代码来探究下a的空间大小是否发生了变化#include <iostream>
using namespace std;
int main()
{
char a[15];
cout << "未运行时,a所占内存空间大小:" << sizeof(a) << endl;
cout << "请输入内容:" << endl;
cin.get(a,20);
cout << "a:" << a << endl;
cout << "运行后,a所占内存空间大小:" << sizeof(a) << endl;
return 0;
}
情况1:当输入的长度小于字符串定义的长度时未运行时,a所占内存空间大小:15
请输入内容:
0123456789a
a:0123456789a
运行后,a所占内存空间大小:15
情况2:当输入的长度大于字符串定义的长度而小于cin.get允许进入的长度时未运行时,a所占内存空间大小:15
请输入内容:
0123456789abcdefgh
a:0123456789abcdefgh
运行后,a所占内存空间大小:15
情况3:当输入的长度大于cin.get允许进入的长度时未运行时,a所占内存空间大小:15
请输入内容:
0123456789abcdefghigklmn
a:0123456789abcdefghi
运行后,a所占内存空间大小:15
我们发现,a所占的内存大小无论哪种情况都没用发生改变
那么我们上述代码的基础上在后面加上 int i;
for(i = 0; i<20 ;i++)
{
cout << i << ":"<< a[i] << endl;
}
输入运行后结果为未运行时,a所占内存空间大小:15
请输入内容:
0123456789abcdefghijklmn
a:0123456789abcdefghi
运行后,a所占内存空间大小:15
0:0
1:1
2:2
3:3
4:4
5:5
6:6
7:7
8:8
9:9
10:a
11:b
12:c
13:d
14:e
15:f
16:g
17:h
18:i
19:
我们发现a居然储存了超过自己定义长度的字符串,为进一步探究,我们把每一个位置的地址也输出一遍,即把cout << i << ":"<< a[i] << endl改为cout << i << ":"<< a[i];
cout << " 地址为:" << (void *)& a[i] << endl;
结果为未运行时,a所占内存空间大小:15
请输入内容:
0123456789abcdefghijklmn
a:0123456789abcdefghi
运行后,a所占内存空间大小:15
0:0 地址为:0x70fdf0
1:1 地址为:0x70fdf1
2:2 地址为:0x70fdf2
3:3 地址为:0x70fdf3
4:4 地址为:0x70fdf4
5:5 地址为:0x70fdf5
6:6 地址为:0x70fdf6
7:7 地址为:0x70fdf7
8:8 地址为:0x70fdf8
9:9 地址为:0x70fdf9
10:a 地址为:0x70fdfa
11:b 地址为:0x70fdfb
12:c 地址为:0x70fdfc
13:d 地址为:0x70fdfd
14:e 地址为:0x70fdfe
15:f 地址为:0x70fdff
16:g 地址为:0x70fe00
17:h 地址为:0x70fe01
18:i 地址为:0x70fe02
19: 地址为:0x70fe03
可以看出地址时连续的,cin.get的作用也一目了然了。
与cin.get用法相同的是cin.getline,如下#include <iostream>
using namespace std;
int main()
{
char a[10];
cout << "请输入内容:" << endl;
cin.getline(a,10);
cout << "a:" << a << endl;
return 0;
}
请输入内容:
0123456789
a:012345678
与cin.get不同的是,cin.get会把换行符留在缓冲区,导致下一个输入失败,例如
对于cin.get#include <iostream>
using namespace std;
int main()
{
char a[10],b[10];
cout << "请输入内容:" << endl;
cin.get(a,10);
cin.get(b,10);
cout << "a:" << a << endl;
cout << "b:" << b << endl;
return 0;
}
请输入内容:
012345678
a:012345678
b:
输入01234568时,a被赋值为012345678,留下换行符在缓冲区,遇到第二个cin.get(b,10)时,b自动接收这个换行符而没有被赋值,导致程序出错
cin.getline#include <iostream>
using namespace std;
int main()
{
char a[10],b[10];
cout << "请输入内容:" << endl;
cin.getline(a,10);
cin.getline(b,10);
cout << "a:" << a << endl;
cout << "b:" << b << endl;
return 0;
}
请输入内容:
012345678
012345678
a:012345678
b:012345678
而cin.getline则不会把换行符留在缓冲区,使得能输入两次012345678使得a,b都赋值
那使用cin.get时如何让换行符不留在缓冲区呢,可以写一个空的cin.get来清除这个换行符,如下#include <iostream>
using namespace std;
int main()
{
char a[10],b[10];
cout << "请输入内容:" << endl;
cin.get(a,10);
cin.get();
cin.get(b,10);
cout << "a:" << a << endl;
cout << "b:" << b << endl;
return 0;
}
对于cin.get与cin.getline还有一种用法,如下#include <iostream>
using namespace std;
int main()
{
char a[10],b[10];
cout << "请输入内容:" << endl;
cin.get(a,10,'#');
cin.get(b,10);
cout << "a:" << a << endl;
cout << "b:" << b << endl;
return 0;
}
请输入内容:
012#14225
a:012
b:#14225
这个第三个参数的作用是但遇到第三个参数的值是自动把其转变为换行并把这个字符留在缓冲区,当用于cin.getline时,这样#就不见了 |