我是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
且仅当输入为有效浮点数时,才会调用scanf("%lf", &something)
。字符串something
是not这样的有效数字。
获得两个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
开头的任何内容似乎都将消耗该字符以及以下字符。