do..while循环中scanf之后的异常行为

问题描述

嗨,我正在独自学习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",x);

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

    }
    while(y_or_n ==1);

    printf("GOOD BYE\n");

    return 0;
}

这次,代码按预期工作了。 即使在执行scanf()之后,x的值也不会更改为0,并且每次输入数字时,该数字都会添加到x中。

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

感谢您阅读。

解决方法

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

似乎变量x紧接在存储器上的变量y_or_n之后,而scanf()写入终止空字符是将x的值设置为0

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

char y_or_n;

/* ... */

scanf(" %c",&y_or_n);

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...