fkyue 发表于 2023-3-7 22:44:02

赋值语句

求助大佬,下面这个代码整数输出结果的问题是由于scanf语句与getchar语句的冲突导致的吗?后边修改了,输出结果是正确的,但不理解这是什么原理导致的

isdkz 发表于 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':
#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;
}

fkyue 发表于 2023-3-7 23:15:15

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

scanf()是一 ...

谢谢!受教了,但是整数类型输出的结果为什么是忽略掉3直接读取的呢

fkyue 发表于 2023-3-7 23:16:56

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

scanf()是一 ...

这是同学的解决办法,觉得很突兀

isdkz 发表于 2023-3-7 23:17:27

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

你说的是你的第一张图?

你的第一张图前面的3和一个空格被前面的那两个 getchar() 读走了呀

isdkz 发表于 2023-3-7 23:20:40

fkyue 发表于 2023-3-7 23:16
这是同学的解决办法,觉得很突兀

这个最后的 Aa 都不需要输入了

fkyue 发表于 2023-3-7 23:23:54

isdkz 发表于 2023-3-7 23:20
这个最后的 Aa 都不需要输入了

嗯嗯,我可不可以理解成对于字符,要么用scanf,遵守它的格式,要么用getchar,按照他的格式

isdkz 发表于 2023-3-7 23:24:01

fkyue 发表于 2023-3-7 23:16
这是同学的解决办法,觉得很突兀

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

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

但是剩下的空格、换行或EOF还是留在缓冲区的而且可以被 getchar 读取

isdkz 发表于 2023-3-7 23:25:33

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

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

而 getchar 没有格式,缓冲区剩下啥就读啥,而且每次只读一个字符

fkyue 发表于 2023-3-8 06:46:36

懂啦,感谢感谢
页: [1]
查看完整版本: 赋值语句