C++字符输入方式详解

本文提到的输入方式有: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日

  • 6
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值