赋值语句
求助大佬,下面这个代码整数输出结果的问题是由于scanf语句与getchar语句的冲突导致的吗?后边修改了,输出结果是正确的,但不理解这是什么原理导致的 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':
#include<stdio.h>
int main(){
int a, b;
float x, y;
char c1, c2;
scanf("%d %d", &a, &b);
scanf("%f %e", &x, &y);
c1 = getchar();
getchar(); // 注意这里
c2 = getchar();
printf("a=%d, b=%d\n", a, b);
printf("x=%f, y=%e\n", x, y);
putchar(c1);
putchar(c2);
putchar('\n');
return 0;
}
isdkz 发表于 2023-3-7 23:09
scanf()和getchar()都是从标准输入(stdin)读取数据的函数,但是它们的工作方式有些不同。
scanf()是一 ...
谢谢!受教了,但是整数类型输出的结果为什么是忽略掉3直接读取的呢 isdkz 发表于 2023-3-7 23:09
scanf()和getchar()都是从标准输入(stdin)读取数据的函数,但是它们的工作方式有些不同。
scanf()是一 ...
这是同学的解决办法,觉得很突兀 fkyue 发表于 2023-3-7 23:15
谢谢!受教了,但是整数类型输出的结果为什么是忽略掉3直接读取的呢
你说的是你的第一张图?
你的第一张图前面的3和一个空格被前面的那两个 getchar() 读走了呀 fkyue 发表于 2023-3-7 23:16
这是同学的解决办法,觉得很突兀
这个最后的 Aa 都不需要输入了 isdkz 发表于 2023-3-7 23:20
这个最后的 Aa 都不需要输入了
嗯嗯,我可不可以理解成对于字符,要么用scanf,遵守它的格式,要么用getchar,按照他的格式 fkyue 发表于 2023-3-7 23:16
这是同学的解决办法,觉得很突兀
你的顺序怎么放就按什么样的顺序输入呗,你记住 getchar 只能从缓冲区读取一个字符就行了,
scanf 会按照你给定的格式符来获取缓冲区的内容的,直到遇到空格、换行或 EOF,
但是剩下的空格、换行或EOF还是留在缓冲区的而且可以被 getchar 读取 fkyue 发表于 2023-3-7 23:23
嗯嗯,我可不可以理解成对于字符,要么用scanf,遵守它的格式,要么用getchar,按照他的格式
可以理解成用 scanf,scanf会用给定的格式从缓冲区中读出数据并处理,
而 getchar 没有格式,缓冲区剩下啥就读啥,而且每次只读一个字符 懂啦,感谢感谢
页:
[1]