【问题标题】:Unexpected behavior after scanf() in do..while loopdo..while 循环中 scanf() 后的意外行为
【发布时间】:2020-09-25 13:39:50
【问题描述】:

大家好,我正在自学C语言。

我的问题是,在使用带有 char 值的 scanf() 时,我是否遗漏了一些需要知道的东西?

为了练习 do...while 循环,我写了一些类似下面的代码,但它没有像我预期的那样工作。

#include <stdio.h>
int main()
{
    char y_or_n;
    int x =1;
    int y;

    do
    {
            printf("ENTER A NUMBER\n");
            scanf("%d", &y);
            printf("THE NUMBER WILL BE ADDED TO x WHICH IS %d\n", x);
            x = x+y;
            printf("x TURNED INTO %d\n", x);

            printf("KEEP DOING THIS?(y/n)\n");
            scanf(" %s", &y_or_n);
            printf("x is %d\n", x);

    }
    while(y_or_n =='y');

    printf("GOOD BYE\n");

    return 0;
}
 

对于第一个循环,它按我的预期工作。 比如我输入7的时候,x变成了8。但是执行scanf()之后,x的值变成了0。 所以从第二个循环开始,x 的值暂时变为 y 的值并再次变为 0。 我猜想scanf()函数有问题,稍微修改一下代码:把y_or_n的类型改成整数,这样scanf()取整数值。

修改后的代码如下

include <stdio.h>
int main()
{
    int y_or_n;
    int x =1;
    int y;

    do
    {
            printf("ENTER A NUMBER\n");
            scanf("%d", &y);
            printf("THE NUMBER WILL BE ADDED TO x WHICH IS %d\n", x);
            x = x+y;
            printf("x TURNED INTO %d\n", x);

            printf("KEEP DOING THIS?(y/n)\n");
            scanf(" %d", &y_or_n);
            printf("x is %d\n", x);

    }
    while(y_or_n ==1);

    printf("GOOD BYE\n");

    return 0;
}

这次代码按我的预期工作。 即使在执行 scanf() 之后,x 的值也没有变为 0,并且每次我输入一个数字时,该数字都会添加到 x。

如果我的问题不清楚,请告诉我。

感谢您的阅读。

【问题讨论】:

  • 尝试为y输入255或更高的值。
  • "在使用 scanf() 时我是否遗漏了一些需要知道的东西" 是的,但这实际上是一个重言式。如果您正在学习 C,我强烈建议您完全避免使用 scanf。如果您尝试使用它,您最终将花费 85% 的时间来调试 scanf 格式语言,而不是真正学习 C。在您对语言有更多经验之前,甚至不要接触 scanf。
  • 实际上,您必须始终检查scanf返回的值。

标签: c char scanf do-while


【解决方案1】:

%s 用于读取以 null 结尾的字符串,因此将指针传递给一字节缓冲区是不好的。

似乎变量x被放置在内存上的变量y_or_n之后,并且scanf()写入终止空字符是将x的值设置为0。

要读取一个字符,请改用%c

char y_or_n;

/* ... */

scanf(" %c", &y_or_n);

【讨论】:

  • 感谢您的评论。我按照你说的修改了代码,它工作了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-23
  • 2020-02-16
  • 1970-01-01
  • 2015-02-16
相关资源
最近更新 更多