Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C printf浮点值的字符串格式_C_String_Printf_String Formatting_Floating Point Conversion - Fatal编程技术网

C printf浮点值的字符串格式

C printf浮点值的字符串格式,c,string,printf,string-formatting,floating-point-conversion,C,String,Printf,String Formatting,Floating Point Conversion,我有一个关于使用printf的问题 char str[8]; float val = 2.334563; sprintf(str, format, val); printf("val = %s.\n", str); val = -23.34563; sprintf(str, format, val); printf("val = %s.\n", str); val = -0.02334563; sprintf(str, format, val); printf("val = %s.\n",

我有一个关于使用printf的问题

char str[8];
float val = 2.334563;
sprintf(str, format, val);
printf("val = %s.\n", str);

val = -23.34563;
sprintf(str, format, val);
printf("val = %s.\n", str);

val = -0.02334563;
sprintf(str, format, val);
printf("val = %s.\n", str);

val = 233;
sprintf(str, format, val);
printf("val = %s.\n", str);
预期产出如下:

val = +2.3345
val = -23.345
val = -0.0233
val = +233.00

我需要什么格式的字符串?谢谢您的关注。

好老的
%f

"%f"
范例

printf("%f\n", floatVal);
使用
snprintf()

格式字符串:

"%#+.5f"

%   modifier
#   force decimal place
+   show + or -
.5  precision of 5
f   use precision as places after decimal 
代码:

输出:

val = +2.3345
val = -23.345
val = -0.0233
val = +233.00
val = +0.0003
val = +2.3346.
val = -23.346.
val = -0.0233.
val = +233.00.

我唯一能想到的是:

const char *format = "val = %+6.*f\n";
int places_past_decimal = ???;
printf(format, places_past_decimal, 2.334563f);
在这种情况下,您需要传递一个附加参数(
超过小数点的位数
),该参数是数字左侧未使用的数字中剩余的位数。

以下(几乎)就是您想要的。注意,我将
str
数组中的字符数从7改为8;由于所有输出字符串都包含7个字符,
sprintf
执行的空终止将导致缓冲区溢出

我的结果和你的结果之间的唯一区别是
sprintf
执行的四舍五入。好了,解决这个问题的唯一方法是使用
floor
预先截断要打印的号码;例如,不舍入打印2位
float f=floor(1.8888*100)/100

#include <stdio.h>

int main(void)
{
  char str[8];

  {
    float val = 2.334563f;
    sprintf(str, "%+6.*f", 4, val);
    printf("val = %s.\n", str);
  }

  {
    float val = -23.34563f;
    sprintf(str, "%+6.*f", 3, val);
    printf("val = %s.\n", str);
  }

  {
    float val = -0.02334563f;
    sprintf(str, "%+6.*f", 4, val);
    printf("val = %s.\n", str);
  }

  {
    float val = 233.0f;
    sprintf(str, "%+6.*f", 2, val);
    printf("val = %s.\n", str);
  }

  return 0;
}

我需要固定大小的输出字符串。
%f“
也不会在正数前显示+号。我考虑过,但希望找到最佳解决方案。这需要手动计算代码中所需的小数位数。在任何情况下,用代码做这件事的方法是什么?我认为snprintf(str,8,“%#+.5f”,0.0003);最好的all@user1020803这在所有情况下都有效。在我所有的更改中迷失了方向,不知道为什么在切换到snprintf()后我仍然使用sig figs。谢谢编辑以反映。未获得所需的输出。他的问题应该问得更直接。@JoeMcGrath:这个问题显然有家庭作业的味道&我不喜欢为家庭作业问题编写任何形式的代码,除了给出提示或想法。原因:我不想让一个程序员坐在我旁边(尽管是几年后),他不能在给出提示的情况下编写源代码。好的,谢谢。我不熟悉堆栈溢出,没有意识到。只是想回答问题。我是一个业余程序员,没上过学。没有想到家庭作业。JoeMcGrath:是的,请。我理解你的热情和帮助的意愿,但我们并不想把你的热情和帮助交给一个“做我的作业”网站。通常,对于Q,我们希望看到OP尝试了什么样的作业味道,他们解决问题的努力和想法。然后提供微妙的提示/线索,这些提示/线索将为他们指明方向并排除障碍,但也会给他们留下足够多的家庭作业。作为一名业余程序员,你肯定知道,除了努力工作,别无选择。欢迎来到SO,并与你见面。祝你一切顺利:)
val = +2.3346.
val = -23.346.
val = -0.0233.
val = +233.00.