【问题标题】:Simple use of sprintf - Csprintf-C的简单使用
【发布时间】:2023-03-20 19:20:01
【问题描述】:

我正在尝试以较小的程序为例来找出为什么会出现更大的问题。这个较小的程序不起作用,让我相信这是我对功能的理解有缺陷。

据我(曾经)相信,以下程序应该初始化一个最多包含 30 个字符的字符串,然后将数字“5”取为九位有效数字,并将其转换为该字符串。然后程序应打印值“5.00000000”。但是,程序会打印值 7.96788(...)。这是为什么呢?

#include <stdio.h>

int main()
{
    char word[30];
    sprintf(word, "%.9g", 5);
    printf(word);
    return 0;
}

【问题讨论】:

  • 您在调用 printf 时不带格式字符串参数?
  • 您的程序导致未定义的行为 - 任何事情都可能发生。
  • 根据您使用的编译器,启用所有警告(例如使用-Wall 用于 gcc)应该会在此处给您一个警告,告诉您究竟出了什么问题。

标签: c printf


【解决方案1】:

或者您可以更改描述符格式:"%.9d"

【讨论】:

    【解决方案2】:

    请改用5.05 本身是一个整数,并且会被位错位化,看起来像一个浮点数,这就是你的 7.xxxx 的来源。

    【讨论】:

      【解决方案3】:

      我看到两个问题:

      1. 正如其他人已经说过的,您必须指定 double 而不是 int。在这些情况下,您的编译器可能会打印出警告(例如 gcc 中的-Wall)。

      2. 要打印出5.00...,您应该使用%f 而不是%g

      这使sprintf(word,"%.9f", (double) 5); 的语法正确。

      【讨论】:

      • 根据我的经验,很少有编译器有这样的警告; GCC 是我所知道的唯一一个。具体来说,选项是-Wformat-Wall 也是我的建议,但会打开其他警告。同样在旧版本的 GCC 上,-Wall 不包括 -Wformat
      • 大多数编译器可能有些夸张。固定的。作为记录,icl 也对此发出警告。
      【解决方案4】:

      这是因为 5 是一个整数 (int),而您告诉 sprintf 假装它是一个双精度浮点数 (double)。你需要改变这个:

      sprintf(word,"%.9g", 5);
      

      到以下任何一个:

      sprintf(word,"%.9g", 5.0);
      sprintf(word,"%.9g", (double) 5);
      

      【讨论】:

      猜你喜欢
      • 2012-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多