gpt4 book ai didi

c++ - 为什么 scanf() 没有变成两个 float

转载 作者:行者123 更新时间:2023-12-02 10:33:23 24 4
gpt4 key购买 nike

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

这是代码:

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

最佳答案

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

你得到两个的原因3值可能是因为 nan是一个有效的浮点数,所以 scanf找到 n并说“哈,这将是 nan”。但随后它发现o 非常令人失望。并决定它不再有效。

但它已经阅读了no从输入流。然后它返回并与 ne 做同样的事情。 (一种)。

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

如果您希望能够处理字符串和数字,您将不得不使用限制最少的(字符串)然后再决定。像这样的东西(虽然 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]);
}
}

使用基本测试数据正常运行:
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

(a) 有趣的是,这似乎只发生在真实的用户输入中,而不是按照我的 printf 通过程序传输数据。陈述。

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

fscanf pushes back at most one input character onto the input stream.



因此,虽然它可能能够比管道上的备份更远,但在处理终端输入时可能并非如此。

当我输入 x作为输入,它似乎确实将其推回,因为后面的每个数组元素都填充了 3 ,表示它正在读取 x不断地。任何以 n 开头的内容似乎只消耗那个和下面的字符。

关于c++ - 为什么 scanf() 没有变成两个 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61421167/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com