鱼C论坛

 找回密码
 立即注册
查看: 1683|回复: 9

赋值语句

[复制链接]
发表于 2023-3-7 22:44:02 From FishC Mobile | 显示全部楼层 |阅读模式

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

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

x
求助大佬,下面这个代码整数输出结果的问题是由于scanf语句与getchar语句的冲突导致的吗?后边修改了,输出结果是正确的,但不理解这是什么原理导致的
mmexport1678200076446.png
mmexport1678200087617.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-7 23:09:01 | 显示全部楼层
scanf()和getchar()都是从标准输入(stdin)读取数据的函数,但是它们的工作方式有些不同。

scanf()是一个格式化的输入函数,它会根据指定的格式符读取相应类型的数据,直到遇到空格、换行或文件结束符(EOF)。

getchar()是一个非格式化的输入函数,它只会读取一个字符,包括空格和换行。

在你的程序中,你先用scanf()读取了两个整数和两个浮点数,然后用getchar()读取了两个字符。

当你输入3 4 8.5 71.82A a并按下回车时,你的输入缓冲区(stdin)中的内容是:3 4 8.5 71.82A a\n

其中\n表示换行符。scanf()会按照你给定的格式符,依次读取3、4、8.5和71.82,并把它们存储在相应的变量中。

然后,scanf()会停止读取,因为它遇到了一个非数字的字符A。此时,输入缓冲区中剩下的内容是:

A a\n

接下来,你调用了两次getchar(),每次都会读取一个字符。第一次getchar()会读取A,并把它存储在c1中。

第二次getchar()会读取空格,并把它存储在c2中。注意,这里的空格是你输入的第一个空格,而不是换行符。

此时,输入缓冲区中剩下的内容是:a\n

最后,你用printf()和putchar()输出了你的变量的值。

printf()会按照你给定的格式符,依次输出3、4、8.5和71.82,并在每行的末尾加上一个换行符。

putchar()会输出c1和c2的值,即A和空格,并在最后加上一个换行符。因此,你的程序的输出是:

a=3, b=4 x=8.500000, y=7.182000e+01 A

如果你想让你的程序按你的预期输出就用一个 getchar() 把空格给读取之后再用 getchar 来读取 'a':
  1. #include<stdio.h>

  2. int main(){
  3.     int a, b;
  4.     float x, y;
  5.     char c1, c2;
  6.     scanf("%d %d", &a, &b);
  7.     scanf("%f %e", &x, &y);
  8.     c1 = getchar();
  9.     getchar();                                            // 注意这里
  10.     c2 = getchar();
  11.     printf("a=%d, b=%d\n", a, b);
  12.     printf("x=%f, y=%e\n", x, y);
  13.     putchar(c1);
  14.     putchar(c2);
  15.     putchar('\n');
  16.     return 0;
  17. }
复制代码

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

使用道具 举报

 楼主| 发表于 2023-3-7 23:15:15 From FishC Mobile | 显示全部楼层
isdkz 发表于 2023-3-7 23:09
scanf()和getchar()都是从标准输入(stdin)读取数据的函数,但是它们的工作方式有些不同。

scanf()是一 ...

谢谢!受教了,但是整数类型输出的结果为什么是忽略掉3直接读取的呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-7 23:16:56 From FishC Mobile | 显示全部楼层
isdkz 发表于 2023-3-7 23:09
scanf()和getchar()都是从标准输入(stdin)读取数据的函数,但是它们的工作方式有些不同。

scanf()是一 ...

这是同学的解决办法,觉得很突兀
mmexport1678202166581.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-7 23:17:27 | 显示全部楼层
fkyue 发表于 2023-3-7 23:15
谢谢!受教了,但是整数类型输出的结果为什么是忽略掉3直接读取的呢

你说的是你的第一张图?

你的第一张图前面的3和一个空格被前面的那两个 getchar() 读走了呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-7 23:20:40 | 显示全部楼层
fkyue 发表于 2023-3-7 23:16
这是同学的解决办法,觉得很突兀

这个最后的 Aa 都不需要输入了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-7 23:23:54 From FishC Mobile | 显示全部楼层
isdkz 发表于 2023-3-7 23:20
这个最后的 Aa 都不需要输入了

嗯嗯,我可不可以理解成对于字符,要么用scanf,遵守它的格式,要么用getchar,按照他的格式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-7 23:24:01 | 显示全部楼层
fkyue 发表于 2023-3-7 23:16
这是同学的解决办法,觉得很突兀

你的顺序怎么放就按什么样的顺序输入呗,你记住 getchar 只能从缓冲区读取一个字符就行了,

scanf 会按照你给定的格式符来获取缓冲区的内容的,直到遇到空格、换行或 EOF,

但是剩下的空格、换行或EOF还是留在缓冲区的而且可以被 getchar 读取
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-7 23:25:33 | 显示全部楼层
fkyue 发表于 2023-3-7 23:23
嗯嗯,我可不可以理解成对于字符,要么用scanf,遵守它的格式,要么用getchar,按照他的格式


可以理解成用 scanf,scanf会用给定的格式从缓冲区中读出数据并处理,

而 getchar 没有格式,缓冲区剩下啥就读啥,而且每次只读一个字符
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-8 06:46:36 From FishC Mobile | 显示全部楼层
懂啦,感谢感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-12 07:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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