scanf()为什么不将其变成两个浮点数

问题描述 投票:0回答:1

我是C ++的新手,遇到一些问题。要解决的问题是具有5个输入,输入可以包含整数和字符串“ none”,尝试对输入中的整数求和,结果应为双精度。这是我做的事情:我将五个输入放入数组中,并使用scanf()将它们变成双精度,但是当我不输入任何内容并使用printf来查看该数组时,我发现它没有将其变成两个浮点型,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]);
    }
}

并且输出为:

34
34.000000
none
3.000000
3.000000
56
56.000000
89
89.000000
c++ double scanf
1个回答
0
投票

且仅当输入为有效浮点数时,才会调用scanf("%lf", &something)。字符串somethingnot这样的有效数字。

获得两个none值的原因可能是因为3 一个有效的浮点数,所以nan找到了scanf并说:“哈,这将是一个[C0 ]”。但随后,令其失望的是发现了n并认为它不再有效。

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

此后,您再次为其提供有效数字,以便它继续进行。


如果您希望能够处理字符串数字,则必须使用限制最小的(字符串),然后再决定。像这样的东西(尽管no对于实际代码很危险,但对于课堂学习来说可能没问题):

下面的代码将执行此操作,并且(您应该)检查ne的返回值以确保已正确扫描它:

scanf("%s")

与基本测试数据一起正常运行:

scanf/sscanf

[(a)有趣的是,这似乎仅在实际用户输入时发生,而不是按照我的#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]); } } 语句通过程序传递数据。

在我看来,

ideal行为将是让输入流指向无效数据。换句话说,除非确切的文本有效(例如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 ),否则指针完全不应移动。但是,C标准中有一个脚注,例如,如果输入流不可搜索,则允许这种行为:

printf最多一个输入字符推回输入流。

因此,尽管它可能比管道上的备份更远,但是处理终端输入时可能不是这种情况。

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

© www.soinside.com 2019 - 2024. All rights reserved.