为什么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