【问题标题】:strtof() producing weird results in Cstrtof() 在 C 中产生奇怪的结果
【发布时间】:2015-02-27 05:13:59
【问题描述】:

首先,使用标志 -Wall、-ansi、-pedantic 进行编译。没有警告或错误。并且没有调试有帮助。

基本上我的代码工作正常,但是当我使用 strtof() 将令牌从字符串转换为浮点数时返回非常奇怪和意外的结果

下面这段代码是:

 printf("token is %s\n", token);
 newstockdata->unitPrice = strtof(token, NULL);
 printf("price is %d\n", newstockdata->unitPrice);

newstockdata 被分配到正确的大小:unitPrice 是一个浮点变量:第一个 printf 语句打印“150.00”:第二个 printf 语句打印“0”,但经过几次迭代后,它返回一个非常长的一致数字。请问有什么帮助吗?

【问题讨论】:

  • 每当我在非托管语言中读到“奇怪和意外”时,我都会立即想到未初始化的内存使用。
  • 您的 printf 中有 %d(整数)。使用 %.2f 可能会更好。
  • 我同意它确实看起来像,但不知道它是如何发生的
  • @RonDahlgren 仅适用于旧 ABI,其中 printf 参数在堆栈上传递。
  • 与问题无关:您真的不想使用浮点数来存储与金钱有关的任何东西。从长远来看(实际上,甚至是短期的),这会给你带来不好的影响。

标签: c string floating-point token


【解决方案1】:

问题就在这里,假设unitPricefloat

printf("price is %d\n", newstockdata->unitPrice);

要打印float,您必须使用%f 说明符。否则,这是未定义的行为,任何事情都可能发生。


您看到的值变化的一个可能解释是您的系统将不同寄存器中的浮点数传递给整数。接收%dprintf 正在查找一个从未设置过的寄存器,因此您会看到先前操作留下的任何值。

这其实很常见,here is an example - %esi 用于int%xmm0 用于浮点值。

【讨论】:

    【解决方案2】:

    您必须处理溢出情况。调用strtof() 后检查errno 是否溢出。如果您认为这些值可能很长,可以使用doublelong double

    【讨论】:

    • 谢谢,不知道 strtof() 会导致溢出,如果你不知道有多少值过去了。
    • 但是 OP 打印出传递给 strtof 的字符串,它是“150.00”,所以这里不太可能溢出。
    • 格式说明符应该是 %f。但他说,经过几次迭代后,就会打印出一个长数字。所以我怀疑这是价值溢出的情况。
    • @Kishore 他使用错误的格式说明符访问无效内存,因此它可能只是在打印垃圾
    • 是的。即使这样也是可能的。但是如果他访问无效内存,他不应该得到分段错误吗?
    猜你喜欢
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多