本文提到的输入方式有:cin cin.get cin.getline gets
一、cin
(1)使用cin输入时要包含头文件iostream。
(2)它从标准输入流中读取对应数据类型的数据,并自动判断读入数据是否有效,可用cin.good()或者cin.fail()来判断
(3)cin语句执行完后不会舍弃最后一个结束符(tab键、空格键、回车键),它被留在缓冲区。
例证
#include <iostream>
using namespace std;
int main()
{
int a1, a2;
cin >> a1 >> a2;
cout << a1 << endl << a2 << endl;
int a3;
a3 = cin.get();
cout << a3;
return 0;
}
可以看到a3是32(空格的ASCll码),说明最后一个结束符没有被丢弃
二、ch=cin.get()与cin.get(ch)
(1)需要包含头文件iostream。
(2)这两个函数是经过重载而得,第一个参数列表为空,其用法是从输入流中读取一个字符并返回该字符的ASCll码,所以这里的ch可以是整型也可以是字符型。
(3)第二个函数的参数列表不为空,为了满足形参实参数据类型一致,这里的ch只能为char型,此函数也表示把输入流的一个字符读入给ch变量。但是它返回的是istream对象,意味着可以使用cin.get(ch1).get(ch2)。一般来讲转换为bool类型用的比较多,当cin.get(ch)没有读到EOF时,返回值bool转换后为true,否则返回false。为了说明两者的区别,请看下例:
char ch;
while((ch = cin.get() ) != EOF) {} (ch=cin.get())返回的是int型,而EOF为-1,所以该表达式正确
while(cin.get(ch) != EOF) {} cin.get(ch)返回的是isream不是EOF所以错误
如果要对第二个进行改正,可以改为while(cin.get(ch)){}表示在到达EOF时进入循环,但是不能写while(cin.get(ch)!=false){},除非对cin.get(ch)进行强制bool型转换。
另外还要注意优先级的问题,如下例
while(ch=cin.get()&&ch!='a'){}由于&&的优先级比=高,所以该语句其实等价于while(ch=(cin.get()&&ch!='a'){}
三、cin.get(字符数组名,长度,结束符)与cin.getline(字符数组名,长度,结束符)
(1)需包含头文件iostream
(2)这两个函数都只能对字符数组进行读入(即参数列表第一个必须是字符数组的首地址,也即字符数组名);这两个函数的长度是包含了尾零'\0'的。比如cin.get(arr,5,'\n')其实只输入了4个字符,第五个是'\0'。
(3)不同的是,cin.getline(...)输入完成之后,后面的所有数据全部被抛弃
举例说明cin.getline(...):
#include <iostream>
using namespace std;
int main()
{
char a[10];
cin.getline(a, 5, ' ');
cout << a << endl;
int ch1;
ch1 = cin.get();
cout << ch1 << endl;
int ch2;
ch2 = cin.get();
cout << ch2 << endl;
return 0;
}
可见,读了5-1个字符后,后面所有的输入都被丢弃了。
举例说明cin.get(...)
#include <iostream>
using namespace std;
int main()
{
char a[10];
cin.get(a, 5, ' ');
cout << a << endl;
int ch1;
ch1 = cin.get();
cout << ch1 << endl;
int ch2;
ch2 = cin.get();
cout << ch2 << endl;
return 0;
}
可见,读了5-1个字符后,并没有丢弃后面的输入。
四、geline(cin,string类型名,结束符)、gets_s(字符数组名,最大读取长度)
(1)C11标准中没有gets函数,因为可能造成缓冲区溢出。可以用gets_s来代替
(2)getline需要包含iostream和string;gets_s包含头文件stdio.h
(3)geline(cin,string类型名,结束符)是string类的输入,所以不指定长度。默认是以回车结束,值得注意的是,它与cin.getline不同,getling函数只丢弃输入结束后面的结束符,结束符后面的输入信息不丢弃。
举例说明:
#include <iostream>
#include <string>
//#include<stdio.h>
int main()
{
using namespace std;
string s;
getline(cin, s, ' ');
cout << s << endl;
int a = cin.get();
cout << a << endl;
int b = cin.get();
cout << b << endl;
return 0;
}
可以看到只有空格被丢弃了,后面的gh没有被丢弃
(4)gets_s函数只从标准输入中读取,第二个参数为最多读取的长度,一般就是数组的大小。gets_s函数读到的如果超出了字符数组的大小就会报错。像这样
#include<stdio.h>
int main()
{
char a[5];
gets_s(a, 5);
printf("\n");
puts(a);
return 0;
}
如果像这样就不会报错(有效输入是5-1)
#---------结束--------#
2022年3月26日