C++输入cin,cin.get(),cin.getline()比较,输出printf

本文详细介绍了C++中cin、cin.get()和cin.getline()三种输入方法的使用,包括它们的结束条件、处理方法及不同参数的情况。cin在遇到[enter],[space],[tab]时会结束输入,而cin.get()会保留这些字符。cin.getline()在遇到[enter]时会删除缓冲区中的[enter],并提供一种以特定字符作为结束输入的选项。" 6175782,696988,VC/MFC 进程间通信:WM_COPYDATA消息实现字符串传递,"['MFC', '进程通信', '数据传输', '结构体']
摘要由CSDN通过智能技术生成

原文:https://blog.csdn.net/a1015553840/article/details/50579396


C++输入过程中,是把输入加载到缓冲区中,然后对缓冲区中的字符进行读取。cin,cin,get(),cin.getline()三个函数虽然都能进行数据读取,但是它们对缓冲区内数据的处理方法是不同的(如遇到[space],[enter]的处理方法)。本文将简单介绍cin,cin.get(),cin.getline()的基本用法,从根本上解释它们对缓冲区数据的处理方法。

1.cin的基本用法

结束条件:[enter],[space],[tab]

处理方法:cin遇到缓冲区中的[enter],[space],[tab]会结束当前输入,并舍弃[enter],[space],[tab],继续下一项输入,当有连续[space],[enter,[tab]会全部舍弃。

程序1:

#include<iostream>
using namespace std;
 
int main()
{
	char a[10],b[10];
	cin>>a;cin>>b;
	cout<<a<<endl<<b<<endl;
}

输入:1234[enter]5678[enter]
输出:1234 【此处换行】 5678

输入:1234[enter][enter[enter] … [enter]5678[enter]

输出:1234 【此处换行】 5678 (说明不管缓冲区中有几个enter,cin都会无视,直到不是enter开始继续读入)tab,space同理

综上:cin的输入很简单,整体的看输入,遇到[enter],[space],[tab]表示当前输入结束,下一个输入从非[enter],[sapce],[tab]开始,两输入间无线多个[space][]enter[tab]都是无效的

2.cin.get()基本用法

(1)一参数

用法:a = cin.get() 或者 cin.get(a)

结束条件:输入字符足够后回车

说明:这个是单字符的输入,用途是输入一个字符,把它的ASCALL码存入到a中

处理方法:与cin不同,cin.get()在缓冲区遇到[enter],[space],[tab]不会作为舍弃,而是继续留在缓冲区中

程序2:

#include<iostream>
using namespace std;
 
int main()
{
	char a,b,c,d;
	a = cin.get();
	b = cin.get();
	c = cin.get();
	d = cin.get();
	cout<<int(a)<<','<<int(b)<<','<<int(c)<<','<<int(d)<<endl;
}

输入:[enter] 输出:不会结束,因为需要输入4个字符才结束(结束需要字符数够后回车)
输入:[enter][enter][enter][enter] 输出:10,10,10,10

输入:abcdef[enter] 输出:97,98,99,100 字符太多时取前几个

输入:[tab][enter][space]a[enter] 输出:9,10,32,97(分别为[tab],[enter],[space],a的ASCALL码)不舍弃[enter],[tab],[space],统一看成字符

综上,一参数的cin.get()当输入字符足够后回车结束输入,把回车[enter],空格[space]也看成字符,在缓冲区中遇到不舍弃。当输入过多时,取前几个。

(2)二参数

用法:cin.get(arrayname,size) 把字符输入到arrayname中,长度不超过size

注释:arrayname必须是char[]类型,即char数组类型,不可以为string类型;size是指输入长度,即允许输入的最大长度。

处理方法:假设把数据输入到 char a[arraylength],数组长度为arraylength。cin.get(a,size)—size,arraylength不同可以分为四类:

类1:输入串长<size,输入串长>arraylength,会自动扩张arrayname大小,使能保存所有数据

例1:char a[10];cin,get(a,20);

输入:123456789012[enter]

输出a数组:123456789012 可以发现,输入12个字符到a[10]中,系统自动扩充a[10],此时实际数组长为13(‘123456789012’\0’’)。但当计算sizeof(a)时,还是现实为10

类2:输入串长<size,输入串长<arraylength,把串全部输入,后面补‘\0’

例2:char a[10];cin.get(a,20);

输入:12345[enter]

输出:12345,此时数组内数据为‘12345‘\0’’

类3:输入串长>size,先截取size个字符,若还是大于arraylength,则输入前arraylength-1个字符,最后补充‘\0’

例3:char a[5];cin,get(a,10);

输入:123456789012[enter]

输出:123456789 先截取了9个字符变成‘123456789‘\0‘’,然后放入到a中,a自动扩张长度

类4:输入串长>size,先截取size个字符,若小于arraylength,则把截取串放入数组中,最后补充‘\0’

例4:char a[15],cin.get(a,10)

输入:123456789012[enter]

输出:123456789 此时数组内为‘123456789‘\0’’ 注意:前size-1有效,最后一个补‘\0’

综上:当吧大于数组长度的字符串放出char a[arraylength]中,系统自动扩张数组a的长度使a能放得下,但是这么做容易产生运行错误

(3)三参数

用法:cin.get(arrayname,size,s) 把数据输入到arrayname字符数组中,当到达长度size时结束或者遇到字符s时结束

注释:a必须是字符数组,即char a[]l类型,不可为string类型;size为最大的输入长度;s为控制,遇到s则当前输入结束缓存区里的s将被舍弃

程序3:

#include<iostream>
using namespace std;
 
int main()
{
	int i;
	char a[10];
	cin.get(a,10,'.');
	cout<<a;
}

输入:abc.123
输出:abc    遇到  ’.‘ 输入结束

3.cin.getline()基本用法

cin.getline()的用法和cin.get()用法大致相同,没有一参数用法,只有二参数,三参数两类

cin.gerline(arrayname,size)

cin.getline(arrayname,size,s)用法与cin.get()效果大致相同,但也有些区别

(1)cin.getline(arrayname,size)与cin.get(arrayname,size)的区别

cin.get(arrayname,size)当遇到[enter]时会结束目前输入,他不会删除缓冲区中的[enter]

cin.getline(arrayname,size)当遇到[enter]时会结束当前输入,但是会删除缓冲区中的[enter]

#include<iostream>
using namespace std;
 
int main()
{
	char a[10];char b;
        cin.get(a,10);
	cin.get(b);
	cout<<a<<endl<<int(b);
}

输入:12345[enter]
输出:12345 【换行】 10

说明:cin.get(a,10)把12345到a中,遇到[enter]结束,但是不把[enter]删除,则把[enter]输入到b中,(enter的ASCALL码为10)

#include<iostream>
using namespace std;
 
int main()
{
	char a[10];char b;
        cin.getline(a,10);
	cin.get(b);
	cout<<a<<endl<<int(b);
}

输入:12345[enter]a[enter]
输出:12345【换行】97

说明:cin.getline(a,10)把12345输入到a中,遇到{enter}结束,并把缓冲区中[enter]删除,把接下来的a输入到b中

(2)cin.getline(arrayname,size,s)与cin.get(arrayname,size,s)的区别

cin.getline(arrayname,size,s)当遇到s时会结束输入,并把s从缓冲区中删除

cin.get(arrayname,size,s)当遇到s时会结束输入,但不会删除缓冲区中的s

#include<iostream>
using namespace std;
 
int main()
{
	char a[10];char b;
    cin.get(a,10,',');
	cin.get(b);
	cout<<a<<endl<<b;
}

输入:12345,[enter]
输出:12345【换行】,

说明:cin.get不会删除缓冲区的,

#include<iostream>
using namespace std;
 
int main()
{
	char a[10];char b;
    cin.getline(a,10,',');
	cin.get(b);
	cout<<a<<endl<<int(b);
}

输入:12345[enter]
输出:12345【换行】10

说明:cin.getline吧12345输入到a中,遇到’,‘结束,并删除缓冲区的’,‘,后面的[enter]输入到b中

4.运用—以任何符号作为输入分隔符

例题:输入五个学生的名字,每个学生的名字不超过10个字符,输入时学生名字之间用逗号隔开,把这五个名字存储并换行输出

#include<iostream>
using namespace std;
 
int main()
{
	char a[5][10];
	int i;
	for(i=0;i<4;i++)
		cin.getline(a[i],10,',');
	cin.getline(a[i],10);
 
	for(i=0;i<5;i++)
		cout<<a[i]<<endl;
}

这样我们就可以完成完成用任何符号作为分割符的输入了!此处getline换成get是不行的,因为cin.get不会删除缓冲区中的分隔符’,‘ 后续输入不能继续进行

4.getline()函数

例题:https://blog.csdn.net/qq_44761480/article/details/100547584
除了cin.getline()函数外,C++还有一个getline()函数。

getline()的原型是istream& getline ( istream &is , string &str , char delim );

其中 istream &is 表示一个输入流,譬如cin;
string&str表示把从输入流读入的字符串存放在这个字符串中(可以自己随便命名,str什么的都可以);
char delim表示遇到这个字符停止读入,在不设置的情况下系统默认该字符为’\n’,也就是回车换行符(遇到回车停止读入)。

int main()
{
    string line:
    while(getline(cin,line) && line!="")
    cout<<line<<endl;
    return 0;
}

当然,也可以指定结束字符,比如指定’#'为结束字符,这时候敲击‘回车’键,输入不会终止:

int main()
{
	string line;
	cout << "please cin a line:"<<endl;
	getline(cin, line, '#');
	cout << endl << "The line you give is:" << line;
    return 0;
}

运行结果:
please cin a line:
fdshv cdhsn
o
o#

The line you give is:fdshv cdhsn
o
o

由于指定的结束符为’#’,所以在输入完第一行后,敲击回车键,程序并没有结束,而是继续等待输入,直到输入了’#’;

通过打印的结果可以看出,换行符也被读入到输入流中,所以一次性输出了两行。

3.getline()函数与cin 混用

getline()和cin混用的时候,需要额外注意:

int main()
{
	int age;
	string name;
	cout << "请输入年龄:" << endl;
	cin >> age;
	cout << "请输入姓名:" << endl;
	getline(cin, name);
	cout << "年龄:" << age << endl;
	cout << "姓名:" << name << endl;
}

输出结果为:

请输入年龄:
12
请输入姓名:
年龄:12
姓名:

输入完年龄:01之后,程序就结束了,并且姓名为空。为什么程序没有等待我们输入姓名呢?

这与cin>>与getline的工作方式有关:

cin>>:流提取运算符根据它后面的变量类型读取数据,从非空白符号开始,遇到Enter、Space、Tab键时结束。并且,cin不会主动删除输入流内的换行符。

getline函数:从istream中读取一行数据,当遇到“\n”时结束返回。

因此,程序执行过程是这样的:

在cin>>age语句获取了年龄之后,把换行符留在了输入流之中;

接下来,getline()函数第一个读入的就是cin>>语句未处理的换行符,导致getline()直接结束。

解决方法:
1、在cin>>语句之后,添加** cin.ignore() 语句,对换行符进行处理即可。
2、在cin>>语句之后,添加
getchar() **语句,对换行符进行处理即可。

int main()
{
	int age;
	string name;
	cout << "请输入年龄:" << endl;
	cin >> age;
	cin.ignore();
	cout << "请输入姓名:" << endl;
	getline(cin, name);
	cout << "年龄:" << age << endl;
	cout << "姓名:" << name << endl;
}

cin.ignore()语句用法,可参考:https://blog.csdn.net/wxbmelisky/article/details/48596881

添加之后,输出正常:

输出Printf

/* printf example */
#include <stdio.h>

int main()
{
   printf ("Characters: %c %c \n", 'a', 65);
   printf ("Decimals: %d %ld\n", 1977, 650000L);
   printf ("Preceding with blanks: %10d \n", 1977);	//占10个空格 occupy 5 space;
   printf ("Preceding with zeros: %010d \n", 1977);	//占10个空格,不够前面补0 Take 10 Spaces. If it don't occupy enough length, put 0 in front.
   printf ("Some different radices: %d %x %o %#x %#o \n", 100, 100, 100, 100, 100);
   printf ("floats: %4.2f %+.0e %E \n", 3.1416, 3.1416, 3.1416);
   printf ("Width trick: %*d \n", 5, 10);
   printf ("%s \n", "A string");
   return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值