为什么scanf()会将零变为二浮点 我是一个C++新手,遇到了一些问题。要解决的问题是 有5个输入,输入可以包括整数和字符串“none”,尝试将输入中的整数相加,结果应为双精度。 以下是我所做的:我在数组中输入了五个输入,并使用scanf()将它们转换为double,但是当我输入none并使用printf查看数组时,我发现它将none转换为两个float,scanf对将字符串转换为double有任何限制吗

为什么scanf()会将零变为二浮点 我是一个C++新手,遇到了一些问题。要解决的问题是 有5个输入,输入可以包括整数和字符串“none”,尝试将输入中的整数相加,结果应为双精度。 以下是我所做的:我在数组中输入了五个输入,并使用scanf()将它们转换为double,但是当我输入none并使用printf查看数组时,我发现它将none转换为两个float,scanf对将字符串转换为double有任何限制吗,c++,double,scanf,C++,Double,Scanf,代码如下: int main() { double sc[5]; for (int i = 0; i < 5; i++) { sc[i] = 3; scanf("%lf", &sc[i]); printf("%lf\n", sc[i]); } } 调用scanf(“%lf”和&something)将填充something当且仅当输入是有效的浮点数时。字符串none不是这样一个有效的数字 得到两个3值的原因可

代码如下:

int main()
{
    double sc[5];

    for (int i = 0; i < 5; i++) {
        sc[i] = 3;
        scanf("%lf", &sc[i]);
        printf("%lf\n", sc[i]);
    }
}
调用
scanf(“%lf”和&something)
将填充
something
当且仅当输入是有效的浮点数时。字符串
none
不是这样一个有效的数字

得到两个
3
值的原因可能是
nan
是一个有效的浮点数,因此
scanf
找到
n
并说“哈,这将是一个
nan
”。但是,令它失望的是,它发现了
o
,并决定它不再有效

但是它已经从输入流中读取了
no
。然后它返回并对
ne
(a)执行相同的操作

在那之后,你开始再次给它有效的数字,这样它就可以继续了


如果您希望能够处理字符串和数字,则必须使用限制最少的字符串(string),然后再进行决定。类似这样的东西(虽然
scanf(“%s”)
对于真正的代码来说是危险的,但对于课堂作业来说可能没什么问题):

以下代码执行此操作,并且(您应该)检查
scanf/sscanf
的返回值,以确保正确扫描:

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

int main() {
    static char bigstring[1000];
    double sc[5];

    for (int i = 0; i < 5; i++) {
        sc[i] = 3;
        if (scanf("%s", bigstring) != 1) {
            puts("*** Could not get input");
            return 1;
        }

        if (strcmp("none", bigstring) == 0) {
            puts("Got 'none', converting to -999");
            sc[i] = -999;
        } else if (sscanf(bigstring, "%lf", &sc[i]) != 1) {
            printf("*** Could not convert input '%s' to float", bigstring);
            return 1;
        } else {
            printf("Got %f\n", sc[i]);
        }
    }

    puts("\nThe five entered numbers were:");
    for (int i = 0; i < 5; i++) {
        printf("   %lf\n", sc[i]);
    }
}

(a) 有趣的是,这似乎只发生在实际用户输入的情况下,而不是按照我的
printf
语句通过程序传输数据

在我看来,理想的行为是让输入流指向无效数据。换句话说,除非确切的文本有效(如
nan
),否则指针不应该移动。然而,C标准中有一个脚注,允许这种行为,例如,如果输入流不可查找:

fscanf
最多向后推一个输入字符到输入流上

因此,虽然它可以比管道上的备份更进一步,但在处理终端输入时可能不是这样

当我输入
x
作为输入时,它似乎会将其向后推,因为后面的每个数组元素都填充有
3
,这意味着它会连续读取
x
。任何以
n
开头的字符似乎只使用该字符和以下字符。

调用
scanf(“%lf”,&something)
将填充
something
当且仅当输入为有效浮点数时。字符串
none
不是这样一个有效的数字

得到两个
3
值的原因可能是
nan
是一个有效的浮点数,因此
scanf
找到
n
并说“哈,这将是一个
nan
”。但是,令它失望的是,它发现了
o
,并决定它不再有效

但是它已经从输入流中读取了
no
。然后它返回并对
ne
(a)执行相同的操作

在那之后,你开始再次给它有效的数字,这样它就可以继续了


如果您希望能够处理字符串和数字,则必须使用限制最少的字符串(string),然后再进行决定。类似这样的东西(虽然
scanf(“%s”)
对于真正的代码来说是危险的,但对于课堂作业来说可能没什么问题):

以下代码执行此操作,并且(您应该)检查
scanf/sscanf
的返回值,以确保正确扫描:

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

int main() {
    static char bigstring[1000];
    double sc[5];

    for (int i = 0; i < 5; i++) {
        sc[i] = 3;
        if (scanf("%s", bigstring) != 1) {
            puts("*** Could not get input");
            return 1;
        }

        if (strcmp("none", bigstring) == 0) {
            puts("Got 'none', converting to -999");
            sc[i] = -999;
        } else if (sscanf(bigstring, "%lf", &sc[i]) != 1) {
            printf("*** Could not convert input '%s' to float", bigstring);
            return 1;
        } else {
            printf("Got %f\n", sc[i]);
        }
    }

    puts("\nThe five entered numbers were:");
    for (int i = 0; i < 5; i++) {
        printf("   %lf\n", sc[i]);
    }
}

(a) 有趣的是,这似乎只发生在实际用户输入的情况下,而不是按照我的
printf
语句通过程序传输数据

在我看来,理想的行为是让输入流指向无效数据。换句话说,除非确切的文本有效(如
nan
),否则指针不应该移动。然而,C标准中有一个脚注,允许这种行为,例如,如果输入流不可查找:

fscanf
最多向后推一个输入字符到输入流上

因此,虽然它可以比管道上的备份更进一步,但在处理终端输入时可能不是这样


当我输入
x
作为输入时,它似乎会将其向后推,因为后面的每个数组元素都填充有
3
,这意味着它会连续读取
x
。任何以
n
开头的字符似乎都只会消耗该字符和以下字符。

非常感谢!但我仍然有两个问题:第一个问题是“sscanf(bigstring,“%lf,&sc[I]==1”是什么意思?”第二个问题是为什么sc数组在for循环后没有修改为双倍,换句话说,我希望当我输入4556432时,sc应该有5个双倍,我是否遗漏了什么?@Peter,
scanf
家族返回成功扫描的项目数,因此与
1
的比较是为了检测它是否失败。如果它起作用,
sc[i]
将被设置并返回一个。我不确定你为什么认为你没有五个双打,我已经稍微修改了代码以使其更清晰。非常感谢!但我仍然有两个问题:第一个问题是“sscanf(bigstring,%lf,&sc[i]==1”是什么意思第二个问题是为什么sc数组在for循环之后没有修改为双倍,换句话说,我希望当我输入4556432时,sc应该有5个双倍,我是否遗漏了什么?@Peter,
sca
pax:~$ printf "34\nnone\n56\n89\n111\n" | ./qq
Got 34.000000
Got 'none', converting to -999
Got 56.000000
Got 89.000000
Got 111.000000

The five entered numbers were:
   34.000000
   -999.000000
   56.000000
   89.000000
   111.000000