为什么在第一次循环中scanf无法给变量赋值

img

img


如图,我让这个循环进行两次,却只输出了第一次的值,而第一次循环只输出了0。这是为什么啊。

因为你输入N的值之后敲了回车,%c会得到一个换行符
你需要在%c之前再加一个%c,把换行符吸收掉,或者前面加个getchar,或者其他类似的指令

因为第二次循环时,x接收的是上一行输入的换行符啊。在每个scanf语句后面加一个getchar(),接收掉换行符就行了

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7620046
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:关于循环中scanf函数能否一次输入的问题探索
  • 除此之外, 这篇博客: 【C语言上机练习题目-代码+运行结果】中的 2.3 输入三角形三边长 ,求三角形周长和 面积 。用scanf输入数据,输出计算结果,输出时要求有文字说明,取消书店后两位小数。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    • 源代码
    # include <stdio.h>
    # include <math.h>
    
    int main ()
    {
    	float a,b,c,l,s,p;
    	printf("请输入三角形三边:");
    	scanf ( "%f%f%f",&a,&b,&c);
    	if (a+b>c&&a+c>b&&b+c>a&&a-b<c&&a-c<b&&b-c<a)//三角形成立的条件是 任意两边和大于第三边,任意两边差小于第三边
    	{
    	l=a+b+c;
    	p=l/2;
    	s=sqrt(p*(p-a)*(p-b)*(p-c));
    	printf("\n三角形三边分别为:\n \na=%7.2f\tb=%7.2f\tc=%7.2f\n\n",a,b,c);
    	printf("三角形的边长为:%7.2f\n\n三角形的面积为:%7.2f\n\n",l,s);
    
    	}
    	else
    		printf("三边不能构成三角形\n");
    	return 0;
    }
    
    
    • 运行结果
      构成三角形的情况
      在这里插入图片描述

    不能构成三角形的情况
    在这里插入图片描述


  • 您还可以看一下 传智老师的2016年c语言教程第3天课程中的 07 使用scanf函数一次接收输入多个数据小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    答案:

    问题分析: 根据提供的参考资料,可以看出scanf存在一些坑点,例如在输入时多加了一个“\n”就会导致无响应,而当输入的类型与要求不一致时,scanf会直接跳过不接收,但是输入的内容并没有被清除,就一直被存在缓存区里,下次读取时又会被读取。这些问题都可能导致无法正常读取输入的值。因此,在查找问题时需要注意这些细节。

    解决方案: 对于该问题,没提供源代码,因此无法准确分析出原因,但从问题描述来看,可能是存在读取类型与要求不一致、或者是输入值被缓存等问题。因此,可尝试以下几点改进:

    1. 检查读取类型是否正确 在循环中加入判断读取的数据项数是否正确,根据正确性决定是否需要跳出循环,如下:
    int n, count=0;
    while (count<2) {
        printf("请输入一个整数:");
        count = scanf("%d", &n);
        if (count != 1) {
            printf("输入的不是整数,请重新输入!\n");
            while (getchar() != '\n');  // 清除缓存区
        }
    }
    

    以上代码中,使用了一个count变量来统计读取数据项的数量,如果count不等于1,说明读取的不是整数,需要重新输入。同时,还加入了清空输入缓存区的语句,防止缓冲区中的非法字符影响下一次输入的正确性。值得注意的是,在用户输入非法字符后要及时清空缓存区,否则会影响下一次的输入,导致错误。

    1. 避免输入缓存问题 在读取完输入数据后,可以加入清空缓存区的语句,防止下一次读取的时候被之前留在缓存区的数据干扰,如下:
    scanf("%d", &n);
    while (getchar() != '\n');  // 清除缓存区
    

    通过以上两方面的改进,应该就能够解决该问题。当然,还需要注意一些细节问题,如输入内容是否符合要求、scanf中是否存在问题等。

    完整代码:

    #include <stdio.h>
    
    int main() {
        int n, count=0;
        while (count<2) {
            printf("请输入一个整数:");
            count = scanf("%d", &n);
            if (count != 1) {
                printf("输入的不是整数,请重新输入!\n");
                while (getchar() != '\n');  // 清除缓存区
            }
        }
        printf("读取的整数为:%d\n", n);
        return 0;
    }