c语言\r和getchar()的用法

 我来答
向阳haha
2019-02-16 · TA获得超过3.7万个赞
知道大有可为答主
回答量:1.2万
采纳率:30%
帮助的人:918万
展开全部
1、getchar和scanf函数都是从输入缓冲stdin里面读取数据,当我们遇到getchar或scanf时,如果输入一串信息后打回车后,这两个函数没有把stdin里面的数据读净,则当出现下一个getchar或scanf时会从stdin里面剩余的格式匹配的数据继续读取,这种情况下就要求在读取前清空stdin
比如:a=getchar();
如果我们此时输入字符a后并回车,a和换行符都被送入了stdin中,该函数仅仅读取了a,在stdin里面会剩余下换行符,所以这个时候我们要用一个getchar();
或fflush(stdin);
把这个换行符读走,否则下一个b=getchar();
会读到换行符;
2、scanf函数的“格式控制字符串”中,如果有除了格式说明符以外的其他字符,则在输入的时候会按照类似于模式匹配的方式进行读取
比如:
scanf("%dmmm%c",
&n,
&ch);
那么我们输入12mmmt
后,n获得12,ch获得字符t,如果我们不按照上面的形式输入,比如输入了12mmt后n会获得12,而由于后面少了个m,所以没有匹配上,此时ch就会读取不成功。
现在回到你的程序,scanf("%c\r%c\r%c\r%c",&a,&b,&c,&d);
此处的\r是一个换行符,当你输入a回车后这个回车正好和\r匹配,所以你写的语句恰好是利用了这一特点使得输入一个字符后接着回车再输入下一个。
另外,\r

\n
以及
\t
这几个转义字符有它的特殊性,我们输入的时候可以用空格、制表位等替代换行符,而上面说的m或者\b等其他字符时则不能以空格或换行来替代,它们必须完全匹配,比如
scanf("%c\t%c\101%c\r%c",&a,&b,&c,&d);
你输入的时候遇到\t或\r的情况下可以输入换行或空格,而遇到\101时必须输入A,也就是说可以按照下面的方式使得输入成功
a
bAc
d,而a
b
c
d则后面的c和d都读不到想要的数据。
教育王叔
2019-06-14 · TA获得超过3.7万个赞
知道大有可为答主
回答量:1.2万
采纳率:25%
帮助的人:911万
展开全部
‘/r'在不同平台的用法:
在Windows中:
'\r'
回车,回到当前行的行首,而不会换到下一行,如果接着输出的话,本行以前的内容会被逐一覆盖;
'\n'
换行,换到当前位置的下一行,而不会回到行首;
Unix系统里,每行结尾只有“<换行>”,即"\n";Windows系统里面,每行结尾是“<回车><换行>”,即“\r\n”;Mac系统里,每行结尾是“<回车>”,即"\r";。一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。
分别在Windws和Linux中查看此文件可知:
Linux中遇到换行符("\n")会进行回车+换行的操作,回车符反而只会作为控制字符("^M")显示,不发生回车的操作。而windows中要回车符+换行符("\r\n")才会回车+换行,缺少一个控制符或者顺序不对都不能正确的另起一行。
函数名:
getchar

能:
从stdio流中读字符

法:
int
getchar(void);
1.从缓冲区读走一个字符,相当于清除缓冲区
2.前面的scanf()在读取输入时会在缓冲区中留下一个字符'\n'(输入完s[i]的值后按回车键所致),所以如果不在此加一个getchar()把这个回车符取走的话,gets()就不会等待从键盘键入字符,而是会直接取走这个“无用的”回车符,从而导致读取有误
3.getchar()是在输入缓冲区顺序读入一个字符(包括空格、回车和Tab)
getchar()使用不方便,解决方法:
(1)使用下面的语句清除回车:
while(getchar()!='\n');
(2)用getche()或getch()代替getchar(),其作用是从键盘读入一个字符(不用按回
车),注意要包含头文件<conio.h>
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
攻略大全369
2019-10-27 · TA获得超过3.7万个赞
知道大有可为答主
回答量:1.2万
采纳率:31%
帮助的人:841万
展开全部
getchar()是字符输入函数
它没有参数,其作用是从终端(或系统指定的输入设备)输入一个字符。
注意:它只能输入一个字符。如果你输入多个字符,它只接受第一个字符。
scanf()是格式输入函数
它有参数,其一般形式是scanf(格式控制,地址列表),其格式字符一般有d,u,o,x,c,s,f,e,g等~也就是说scanf()规定了你要输入的数据类型。比如
scanf("%d%c\n",&a,&b)那么你必须输入一个整型数据,它的值会赋给a,一个字符型数据付给b。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
龙南医疗120
2020-03-24 · TA获得超过3.7万个赞
知道小有建树答主
回答量:1.2万
采纳率:34%
帮助的人:820万
展开全部
要明白这个这个问题,首先要理解输入缓冲的机制和scanf的原理。
当运行控制台程序的时候,会有一个输入缓冲区,这个缓冲区就是放置你输入的字符串的,无论你输入的是数字还是字符,放到缓冲区里都是字符串,只有你调用scanf时指定不同的格式才会产生不同的含义。只有当你输入回车的时候,才会把你的输入添加到缓冲区里,当输入回车之前,scanf和getchar都还没有调用。
当你调用scanf的时候,会首先检查缓冲区是否还有内容,如果没有则程序停止,接受输入,当你输入回车后,你的输入进入缓冲区,然后scanf从缓冲区中拿出(拿出的意思是从缓冲区复制一份放到变量里,然后从缓冲区中删除)它想要的字符,如果没有它想要的,则不会从缓冲区中删除任何东西,继续运行。关键是什么是它想要的,这就跟scanf的第一个参数里指定的格式有关了。
如果格式是%c,那么任何字符都是它想要的,所以你第二个程序里的第二个scanf("%c")会得到‘+’后面的空格'
'。如果格式是%d,则会忽略任何空白字符(空格、回车、制表符等),忽略的意思是,从缓冲区里删除,但并不保存;如果遇到数字,则拿出并保存给后面的整数,也就是说%d的时候,scanf想要的字符是数字和空白符。所以你第一个程序里的第二个scanf("%d")忽略掉了空格,正确输入了数字。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
南山南happy
2019-09-29 · TA获得超过3.6万个赞
知道大有可为答主
回答量:1.2万
采纳率:30%
帮助的人:912万
展开全部
#include<stdio.h>
int main()
{
char a,b,c,d;
a=getchar();
getchar(); //用来接收上面回车的换行符
b=getchar();
getchar();
c=getchar();
getchar();
d=getchar();
getchar();
printf("a=%c b=%c c=%c d=%c ",a,b,c,d);
return 0;
}
第二个程序
#include<stdio.h>
int main()
{
char a,b,c,d;
scanf("%c\r%c\r%c\r%c",&a,&b,&c,&d); //\r在这里无意义,可以不要
printf("a=%c b=%c c=%c d=%c ",a,b,c,d);}
return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式