_____TJ
发表于 2018-7-27 17:23:47
它获取的是下一个字符,那第一个字符怎么获取呢?
21228827
发表于 2018-9-1 15:39:26
本帖最后由 21228827 于 2018-9-1 15:50 编辑
getchar()函数执行一次会从键盘缓冲区(如果有内容就读取,没有内容就等待用户输入并以回车结束,回车相当于加上一个换行符\n)顺序读取一个字符并返回此ASCII码,举个例子:当我们调用一次getchar()时,然后输入abc并回车,此时abc和\n才一起送入了键盘缓冲区,总共就是4个字符。而此时getchar()由于只运行了一次,所以取到的是a,剩下缓冲区的字符就是bc\n 源程序里while(getchar()!='\n')意思就是一个一个字符读取,直到碰到\n也就是回车就停止(当然\n也就不会被计入累加值)。我们在执行此程序时很直观的感受是输入完一个句子,然后回车马上print,其实回车之后又根据句子长度执行了N次(我有点啰嗦了)
还有一个问题就是有朋友提出视频里getchar()过滤回车的问题,其实就是scanf()比如输入Y并回车之后,scanf只读并取走了一个字符,此时\n也就是回车符依然在键盘缓冲区里(有点像getchar()),此时调用getchar()但又不把他的值赋予其他变量,不正好起到了把那个多余的\n用getchar()“过滤掉”的作用吗,使用之后缓冲区就是空的了,下次调用scanf因为是空的,就会等待用户输入,也就自然不会自动取到遗留的\n
我一开始也是没搞懂,后来自己动手写了几次程序才摸懂了原理,表达不是很好,不对的地方请大神指正
#include <stdio.h>
int main(int argc, char *argv[])
{
char test1;
char test2;
char test3;
char test4;
scanf("请输入:%c%c%c" ,&test1,&test2,&test3);
test1=getchar();
test2=getchar();
test3=getchar();
test4=getchar();
printf("test1=%dtest2=%dtest3=%dtest4=%d\n",test1,test2,test3,test4);
printf("test1=%ctest2=%ctest3=%ctest4=%c\n",test1,test2,test3,test4);
return 0;
}
沙耶加
发表于 2018-9-8 13:34:57
{:10_266:}不懂
xiao10
发表于 2018-9-14 21:37:25
lianyingteng 发表于 2016-2-23 15:57
不懂???
表示有点蒙{:5_94:}
saberAMD
发表于 2018-11-8 09:20:29
我能说没看懂吗
大显666
发表于 2019-1-10 16:33:34
不是很懂
1809228982
发表于 2019-4-19 11:47:02
getchar 是不是也把换行符给输入进去了?虽然并没有进入while循环。
15637889015
发表于 2019-5-22 15:19:53
一样啊
白汤圆
发表于 2019-5-24 20:31:25
21228827 发表于 2018-9-1 15:39
getchar()函数执行一次会从键盘缓冲区(如果有内容就读取,没有内容就等待用户输入并以回车结束,回车相当于 ...
感谢,终于看懂了。。。试了一下,发现确实是只获取一个字符,在过滤回车那个视频里面的代码运行时,女神是否有空,在输入Y之后加一个空格再回车,发现getchar确实失效了。{:10_275:}
清尘yt
发表于 2019-7-30 16:23:58
加快进度!!!
小谨谨
发表于 2019-9-26 11:15:41
做课后作业遇到一个问题
#include<stdio.h>
int main()
{
int h,ch=0;
printf("请输入一个英文句子:");
while(getchar() != '\n')
{
if(getchar() ='A'&&getchar() <='C')
{
ch=ch+1;
}
}
printf("你一共输入了%d个大写字母!\n",ch);
return 0;
}
像这样不将getchar赋值为整形变量,直接比较的话程序就会报错,是运算符两边是表达式的原因吗,函数的返回值不能用getchar()直接表示吗?{:10_266:}
Monory小乐
发表于 2019-11-28 18:02:58
#include <stdio.h>
int main()
{
int c = 0;
printf("请输入一行英文:");
while (getchar() < 91)
{
c = c + 1;
}
printf("你一共输入了%d个大写字母", c);
return 0;
}
BCwhite
发表于 2019-12-14 12:07:32
还是不知道
pangjiwei365
发表于 2019-12-15 20:35:05
21228827 发表于 2018-9-1 15:39
getchar()函数执行一次会从键盘缓冲区(如果有内容就读取,没有内容就等待用户输入并以回车结束,回车相当于 ...
好
大甲鱼873639952
发表于 2020-1-14 10:32:44
re-born 发表于 2017-1-19 12:34
为什么这个输入的语句不需要scanf来装?
同问
ikwen
发表于 2020-2-7 21:47:39
本帖最后由 ikwen 于 2020-2-7 21:56 编辑
(getchar() != '\n')
就是这里的!=没看懂。为什么要加上这个呢:
我知道了,只有不等于回车,才会执行计数。
Bobo_Keiko
发表于 2020-2-15 22:15:52
21228827 发表于 2018-9-1 15:39
getchar()函数执行一次会从键盘缓冲区(如果有内容就读取,没有内容就等待用户输入并以回车结束,回车相当于 ...
感觉你说的是对的,给你点赞!
Kirin29
发表于 2020-2-17 19:01:01
lntouchables 发表于 2017-6-2 21:13
#include
int main()
这个while后真的有分号吗
千夜绯雪
发表于 2020-3-3 18:24:31
小谨谨 发表于 2019-9-26 11:15
做课后作业遇到一个问题
#include
int main()
你这一个循环里面getchar就运行了三次,依次读取了三次缓冲区。应该每次循环调用getchar的时候赋值给一个变量保存
ming@1993
发表于 2020-3-6 13:49:59
学习了