【问题标题】:sscanf does not correctly convert floats when size of array is fixed数组大小固定时,sscanf 无法正确转换浮点数
【发布时间】:2019-02-26 21:14:57
【问题描述】:

我正在尝试使用sscanf 将C 中的char 数组转换为double。我的问题在这个简短的最小工作示例中得到了最好的描述:

#include <stdio.h>

int main (int argc, char **argv)
{
  char string_one[]  = "1.2e-4";
  char string_two[6] = "1.2e-4";

  double one, two;

  sscanf(string_one, "%lf", &one);
  sscanf(string_two, "%lf", &two);

  printf("%e, %e\n", one, two);

  return 0;
}

使用 GCC 编译并运行生成的可执行文件返回 1.200000e-04, 1.200000e-41,而不是两次返回相同的数字。如果我要转换的浮点数的格式为3e4(如果没有小数分隔符),则不会出现此问题。

对于我的程序,我必须定义一个具有固定大小的 char 数组(因为我在程序过程中填充数组),这就是我遇到这个问题的原因。

我想这个问题可能很明显 - 但由于我是 C 语言的新手,我不知道问题可能是什么。任何帮助表示赞赏!

【问题讨论】:

  • string_two 不是以空值结尾的。
  • string_two 不是字符串。您不能将它与大多数 &lt;string.h&gt; 函数一起使用,printf() 中的 "%s" 作为 sscanf() 的第一个参数,...
  • 您没有为string_two 提供足够的字符。 `"1.2e-4" 需要 7 个字符,而不是 6 个,因为字符串需要一个空终止符。
  • 好的,非常感谢大家,我还没有听说过空终止符。所以一般来说,如果我要构建自己的字符串,我总是必须添加空终止符 '\0' 作为最后一个字符(并使 char 的每个数组更长一个元素?)
  • OT:关于:int main (int argc, char **argv)main()的参数不打算使用时,使用签名:int main( void )

标签: c string floating-point double scanf


【解决方案1】:

char string_two[6] = "1.2e-4"; ... sscanf(string_two, "%lf", &amp;two); 期望扫描一个字符串string_two[] 不是 字符串,因为它缺少 空字符。结果:未定义的行为 (UB)。

解决方案:确保string_two[] 是一个字符串

【讨论】:

    猜你喜欢
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 2013-08-19
    • 1970-01-01
    相关资源
    最近更新 更多