【问题标题】:switch with scanf one more input用 scanf 再切换一个输入
【发布时间】:2014-10-17 23:41:50
【问题描述】:

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

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",&amp;x1,&amp;y1); --> scanf("%d%d%*c",&amp;x1,&amp;y1); or scanf("%d%d",&amp;x1,&amp;y1); ...当有\n时,它会等待输入直到有一个非空白字符。
  • @BLUEPIXY 我肯定会回答。
  • 谢谢!我不认为 \n 会犯那个错误,因为在接下来的情况下,它没有犯与案例 0 相同的错误。再一次感谢我并拥抱我! ^_^
  • 始终检查输入函数的返回值(在您的情况下为scanf)。
  • 下次我会更加小心...顺便说一句:只是声誉低下还是我找不到问题已回答?

标签: c


【解决方案1】:

你的问题在于这一行:

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

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

由空白字符组成的指令通过读取输入直到第一个非空白字符(仍然未读取)来执行,或者直到无法读取更多字符.该指令永远不会失败。

因此,根据您问题中的输入值,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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 2011-07-24
    • 1970-01-01
    相关资源
    最近更新 更多