gpt4 book ai didi

c - 用 scanf 切换多一个输入

转载 作者:太空宇宙 更新时间:2023-11-03 23:48:42 25 4
gpt4 key购买 nike

我想问一下,是否有人可以帮助我解决我在代码中遇到的问题。我的意思是,虽然我想要 scanf 2 个变量,但代码还需要一个输入……不知道有什么问题……顺便说一句:我添加了部分代码

enter image description here

for(i;i<4;i++){
switch(i){
case 0:{
printf("Bod #1:\n");
scanf("%d%d\n",&x1,&y1);
printf("x1=%d y1=%d\n",x1,y1);
printf("working 1\n");
}
break;

最佳答案

你的问题在于这一行:

scanf ("%d%d\n", &x1, &y1);

特别是格式字符串中的 \n。引用标准(C11 7.21.6.2 The fscanf function/5 并记住 \n 是一个空白字符:

A directive composed of white-space character(s) is executed by reading input up to the first non-white-space character (which remains unread), or until no more characters can be read. The directive never fails.

因此,根据您问题中的输入值,scanf 开始处理格式字符串 "%d%d\n"

第一个格式说明符 %d 需要更多输入,当您输入 45\n 时,它会跳过任何空白(没有空白)并加载将整数放入其变量中,留下 x1 == 45 和输入流(^ 表示下一个读取点):

45\n
^

第二个格式说明符 %d 跳过空格(\n)然后需要更多数据,因此您输入 459\n .然后它将该整数加载到它的变量中,留下 y1 == 459 和输入流:

45\n459\n
^

这就是您的问题开始的地方。 final 格式说明符 \n 需要读取到 但不包括 第一个非空白字符。但它不能告诉此时有一个非空白字符(因为您可能会输入更多的空白),因此它再次需要您提供的更多输入:54\n.这使得输入流为:

45\n459\n54\n
^

现在,\n 格式说明符知道 54 中的 5 是第一个非空白字符,它停止在阅读之前,给出:

45\n459\n54\n
^

那是 scanf() 返回的点,因为所有格式说明符都已满足。当然,下一次调用 scanf("%d%d...") 时,输入流中已经有 54\n,因此将用于填充x1。在 scanf() 返回之前,您仍然必须再输入两个值,第一个将填充 y1,第二个将满足\n 说明符。


现在,如何修复它。嗯,这很容易。如上所述,%d(和大多数其他格式字符串)在尝试读取数据之前会跳过空格。

这意味着如果您只使用 "%d%d" 作为您的格式字符串,换行符将被自动忽略,没有有问题的 \n.

例如,请参见以下代码:

#include <stdio.h>

int main (void) {
int x1, y1;

printf("Bod #1:\n");
scanf("%d%d",&x1,&y1);
printf("x1=%d y1=%d\n",x1,y1);
printf("working 1\n");

printf("\nBod #2:\n");
scanf("%d%d",&x1,&y1);
printf("x1=%d y1=%d\n",x1,y1);
printf("working 2\n");

return 0;
}

和样本运行:

Bod #1:
45
459
x1=45 y1=459
working 1

Bod #2:
314159
271828
x1=314159 y1=271828
working 2

关于c - 用 scanf 切换多一个输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26434870/

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