gpt4 book ai didi

c - 为什么 scanf ("%d\n%d\n%d\n",&a,&b,&c);接受 4 个输入。它必须接受 3 个输入,但期望并接受 4 个输入

转载 作者:行者123 更新时间:2023-11-30 15:39:42 27 4
gpt4 key购买 nike

为什么下面的scanf语句接受 4 个输入,而它必须接受 3 个输入?

#include<stdio.h>    
int main()
{
int a,b,c;
scanf("%d\n%d\n%d\n",&a,&b,&c);
return 0;
}

它必须接受 3 个输入,但期望并接受 4 个输入。如果我提供 3 个输入,它就不起作用。如果我删除第三个\n 字符,则程序接受 3 个输入。

最佳答案

该程序仅似乎接受 scanf() 的 4 个输入。

int a,b,c;
scanf("%d\n%d\n%d\n",&a,&b,&c);

对于每个 "%dscanf() 都会读取
1) 任何前导空格,包括 ' ''\n' 以及其他空格
2) 它读取数字以形成int,直到读取到非数字,通常是\n
3) 这个额外的char被放回到stdio中以供后续扫描。

\n 告诉 scanf() 读入而不是保存任意数量的空白,而不仅仅是 '\n'。读取将继续,直到读取到非空白为止。该非空白区域将放回到 stdio 中以供后续扫描。

因此,对于 3 组 "%d\n",一次需要输入以下内容让 scanf() 读取 3 个 int并完成。

optional-white-space  (+-)[1 or more 0-9]  optional-white-space
optional-white-space (+-)[1 or more 0-9] optional-white-space
optional-white-space (+-)[1 or more 0-9] optional-white-space 1-non-white-space

请记住,非空白已放回以供后续 I/O 使用。这个短程序再也没有尝试过读取它。

由于 stdin 通常是缓冲的,因此最后一个非空白 需要在控制台将行提供给 标准输入

<小时/>

处理用户 I/O 的最佳方法是首先使用 fgets() 获取文本行,然后使用 sscanf()strtol( )strtof()strtok() 来解析接收到的行。

// Example reading 1 `int` per line
int a[3];
for (int i=0; i<3; i++) {
char buf[40];
if (fgets(buf, sizeof buf, stdin)== NULL) Handle_EOForIOError();
if (sscanf(buf, "%d", &a[i]) != 1) Handle_ParseError();
}

关于c - 为什么 scanf ("%d\n%d\n%d\n",&a,&b,&c);接受 4 个输入。它必须接受 3 个输入,但期望并接受 4 个输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21346693/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com