如何在 C 中通过 atof() 正确转换扫描的字符串?

  • 本文关键字:转换 扫描 字符串 atof c
  • 更新时间 :
  • 英文 :


我需要验证通过scanf((传递的字符串是否只是数字,并且"."和","也应该可以接受"-"作为负数表示。 我写了这段代码:

int main(void)
{
char cFloatNum[100];
float fNum;
scanf("%[[+-]?[0-9]*[.,]?[0-9]+]", &cFloatNum);
fNum = atof(cFloatNum);
printf("%f", fNum);
return EXIT_SUCCESS;
}

我不知道为什么,但无论我写什么数字,我的输出似乎总是0.000000。我尝试在各种正则表达式网站上测试我的正则表达式,它完美匹配。

将某些内容写入控制台后,如果有效,则应通过 printf 在控制台上打印。对于从字符串到浮点的转换,我需要使用atof()函数。

有效数字的示例包括:

-44.276
44,546
56,657675
-77.2435235

只有数字和"."和","也应该接受,"-"作为负数表示

所以写正是这样。例如:

#include <stdio.h>
#include <ctype.h>
#include <stdbool.h>
int check_your_condition(float *result) {
int ret = 0;
*result = 0;
bool seen_minus = false;
bool first_character = true;
bool seen_dot = false;
float div = 10;
for (int c; (c = getchar()) != EOF; first_character = false) {
if (first_character == true && seen_minus == false && c == '-') {
seen_minus = true;
continue;
}
if (seen_dot == false && (c == '.' || c == ',')) {
seen_dot = true;
continue;
}
if (!isdigit((unsigned char)c)) {
ret = -1;
// TODO handle error properly
break;
}
const short num = c - '0';
if (seen_dot == false) {
*result *= 10;
*result += num;
} else {
const float numf = num / div;
div *= 10;
*result += numf;
}
}
if (seen_minus) {
*result *= -1;
}
return ret;
}
int main() {
float a;
check_your_condition(&a);
printf("%fn", a);
}

这不是一个"即用型"(TM(程序,因为多行上的换行符仍然在输入流中被"忽略"(即isdigit(c)将失败(。一个正确的解决方案应该在那里调用ungetc,并包括如何处理其余输入的正确逻辑。

scanf("%[[+-]?[0-9]*[.,]?[0-9]+]">

是完全错误的。否scanf不支持正则表达式。

对于从字符串到浮点数的转换,我需要使用 atof(( 函数。

最有可能的是,系统会要求您将输入作为一行读取,然后对结果应用atof函数:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main() {
char buf[200];
if (fgets(buf, sizeof(buf), stdin) == NULL) abort();
errno = 0;
const float a = atof(buf);
if (errno) abort();
printf("%fn", a);
}

在这样的解决方案中,如果.,将被理解为小数分隔符是依赖于区域设置的。字符串后面的输入字符串部分将被忽略。

最新更新