鱼C论坛

 找回密码
 立即注册
查看: 1409|回复: 8

[已解决]scanf和getchar的关系是什么???

[复制链接]
发表于 2021-4-13 22:18:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 s120lan 于 2021-4-13 22:26 编辑

当我写程序时,有scanf和没有scanf时,getchar计算的字符个数为什么不一样呀!!!!!! QQ图片20210413222521.png QQ图片20210413222431.png
最佳答案
2021-4-13 22:34:07
2个函数没关系。搞懂2个函数的用法就行了。
scanf是从键盘缓冲区(也就是你输入的字符串中)获取需要的内容。
比如:
scanf("%d", &a);
你输入: 123a
那么scanf取的的是123。
后面还有 "a\n" a和你的回车仍然在缓冲区中。

getchar是从键盘缓冲区中获取一个字符。
比如:
你输入: 123a
getchar
那么getchar取的值是1,缓冲区留 下"23a\n"
再getchar取的值是2,,缓冲区留 下"3a\n"
......

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-4-13 23:08:21 From FishC Mobile | 显示全部楼层
我已经弄懂了,scanf()在读取一串输入的字符串时并不能全部读入,我这个题scanf只读取了i就停止了。这是因为scanf()开始读取输入以后,会在遇到的第一个空白字符空格、制表符(tab)或换行符(\n)出停止读取。然后getchar就是从空格到最后,所以是9个字符。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-13 22:34:07 | 显示全部楼层    本楼为最佳答案   
2个函数没关系。搞懂2个函数的用法就行了。
scanf是从键盘缓冲区(也就是你输入的字符串中)获取需要的内容。
比如:
scanf("%d", &a);
你输入: 123a
那么scanf取的的是123。
后面还有 "a\n" a和你的回车仍然在缓冲区中。

getchar是从键盘缓冲区中获取一个字符。
比如:
你输入: 123a
getchar
那么getchar取的值是1,缓冲区留 下"23a\n"
再getchar取的值是2,,缓冲区留 下"3a\n"
......

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-13 22:39:32 From FishC Mobile | 显示全部楼层
但是我这个程序问题出在哪里呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-13 22:41:12 From FishC Mobile | 显示全部楼层
ba21 发表于 2021-4-13 22:34
2个函数没关系。搞懂2个函数的用法就行了。
scanf是从键盘缓冲区(也就是你输入的字符串中)获取需要的内 ...

我这个程序问题是在哪里呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-13 22:43:03 | 显示全部楼层
s120lan 发表于 2021-4-13 22:39
但是我这个程序问题出在哪里呢?

%d 取一个整数,%c就是取一个字符, %f 就是取一个浮点数。。。

学会举一反三啊。。。


scanf("%c", &a); // 取一个字符
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-13 22:43:59 | 显示全部楼层
s120lan 发表于 2021-4-13 22:39
但是我这个程序问题出在哪里呢?

在你第2段代码后,你把ch的值打印出来不就什么都明白了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-13 22:45:21 | 显示全部楼层
s120lan 发表于 2021-4-13 22:41
我这个程序问题是在哪里呢?
#include<stdio.h>

int main(){
        int a;
        scanf("%d",&a); // 输入 123a
        printf("%d\n", a); // 123
        printf("%a\n", getchar()); // a
        printf("%d\n", getchar()); // 输出 10, \n 的ascii码值为10
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-12 21:51:26 | 显示全部楼层
仅供参考
比如你输入了i love you,一共10个字符,键盘缓冲区内一共储存了10个字符,这俩函数应该是scanf取了第一个i,然后进了循环,然后缓冲区还剩下 love you,一共9个字符了,反汇编具体没完,但是猜测,这俩函数应该共用的一个栈。。如果中间键盘缓冲区没发生过变化的话
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-21 18:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表