c - 编译器在 double 之后跳过 scanf 语句进行字符输入。为什么会这样?

标签 c types scanf

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main()
{
    int intvar=0; //variable to store integer input
    double decimalvar = 0; //variable to store double input
    char string[30]; //arrary to store string

    scanf("%d",&intvar); //scan for int input
    scanf("%f",&decimalvar); //scan for double input
    scanf("%[^\n]",string); //scan for a line input

    printf("%d\n",intvar); //print int var
    printf("%.1f\n",decimalvar);//print double var
    printf("%s",string);//print string

    return 0;
}

程序运行成功,但只需要两个输入。输入第二个输入后,跳过第三个scanf语句,执行printf语句。为什么会这样?

最佳答案

scanf("%f",&decimalvar); 

应该是:

scanf("%lf",&decimalvar); 

因为您传递的是 double 而不是 float

这在技术上是未定义的行为,但不是您问题的原因,即在 scanf 调用后标准输入缓冲区中留下了一个换行符。 dflf 等说明符使用并忽略该换行符。当然,说明符 [^\n] 会找到换行符并停止读取,同时在标准输入缓冲区中保留一些输入。

要解决此问题,请在 scanf 格式字符串的开头添加一个空格,这将在尝试读取标准输入之前占用换行符。

scanf(" %[^\n]",string);

关于c - 编译器在 double 之后跳过 scanf 语句进行字符输入。为什么会这样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36311936/

相关文章:

c - 我在 C 语言中读取 .txt 文件中的单词时遇到一些问题

c - 绕过 scanf 中的 null char

c - 使用 fscanf_s 时发生访问冲突

c - 在 C 函数中声明 vector 时出错

c - 负时间转换给出随机值

C - 为什么我的缓冲区打印不正确?

javascript - 添加字符串和数字时,JavaScript 如何转换为字符串?

arrays - Swift:二进制搜索标准数组?

c - 结构体中指针的偏移量,以及如何获取汇编中的值

c++ - 如何在 if/else 序列中定义未知类型的全局变量?