我有一个我正在开发的应用程序,我的一个功能是在需要时给出float或double值的答案,当答案是整数时给出一个整数
所以例如如果答案是8.52,则答案变为8.52,但当答案为8时,答案是8而不是8.0000,我不希望它显示所有额外的0.
- (IBAction) equalsbutton {
NSString *val = display.text;
switch(operation) {
case Plus :
display.text= [NSString stringWithFormat:@"%qi",[val longLongValue]+[storage longLongValue]];
case Plus2 :
display.text= [NSString stringWithFormat:@"%f",[val doubleValue]+[storage doubleValue]];
Run Code Online (Sandbox Code Playgroud)
这段代码似乎不起作用
该%g说明符似乎并不在多数来源记录它运行得的方式行事.
根据我发现的大多数来源,在使用printf说明符的多种语言中,说明%g符应该等同于%f或者%e- 对于提供的值产生较短的输出.例如,在撰写此问题时,cplusplus.com表示说明g符意味着:
使用最短的表示:
%e或%f
而PHP手册说这意味着:
g - %e和%f中的较短者.
而且这里有一个堆栈溢出的答案是声称,
%g使用最短的表示.
而Quora的回答声称:
%g以这两个表示中最短的方式打印数字
但这种行为不是我在现实中看到的.如果我编译并运行该程序(作为C或C++ - 它是一个在两者中具有相同行为的有效程序):
#include <stdio.h>
int main(void) {
double x = 123456.0;
printf("%e\n", x);
printf("%f\n", x);
printf("%g\n", x);
printf("\n");
double y = 1234567.0;
printf("%e\n", y);
printf("%f\n", y);
printf("%g\n", y);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
...然后我看到这个输出:
1.234560e+05
123456.000000
123456
1.234567e+06
1234567.000000
1.23457e+06
Run Code Online (Sandbox Code Playgroud)
显然, …
我遇到了一些代码,并想知道最初的开发人员是做什么的.以下是使用此模式的简化程序:
#include <stdio.h>
int main() {
char title[80] = "mytitle";
char title2[80] = "mayataiatale";
char mystring[80];
/* hugh ? */
sscanf(title,"%[^a]",mystring);
printf("%s\n",mystring); /* Output is "mytitle" */
/* hugh ? */
sscanf(title2,"%[^a]",mystring); /* Output is "m" */
printf("%s\n",mystring);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
可能重复:
如何printf uint64_t?
我想u_int64_t用C 打印.我想知道格式说明符吗?我是C用户,我想做一个printf().
以下代码在C中的含义是什么
scanf("%d%#d%d",&a,&b,&c);
Run Code Online (Sandbox Code Playgroud)
如果给定值,1 2 3则给出输出为1 0 0
PS-我知道它与printf()声明一起使用但在scanf()声明中它给出了随机行为.
刚刚遇到一些(非常)遗留代码(最初编写为C但现在编译为C++)并使用宽度说明符将零填充字符串
void main()
{
unsigned long val = 2413;
printf("V1: %08lu \n", val);
printf("V2: %8.8lu \n", val);
}
Run Code Online (Sandbox Code Playgroud)
结果是一样的
V1: 00002413
V2: 00002413
Run Code Online (Sandbox Code Playgroud)
那么为什么要使用V2呢?从昔日开始,它是std lib的遗留方面吗?
编译器详细信息:用于x86的Microsoft(R)C/C++优化编译器版本19.10.25019
printf("%*d",变量);
我想知道 printf 函数中 (*) 有什么用
我正在处理交叉编译到多个目标架构的代码。
我看着少数 的 点击来自搜索堆栈溢出的的“printf的size_t未知的转换型性格”的警告,但这些职位似乎都涉及到minGW,所以这些问题的答案,基本上是ifdef荷兰国际集团对抗_WIN32,并不适用于我的基本上是相同的实例问题,即printf不识别“ %zu”作为 的格式说明符size_t,但使用mips交叉编译器。
是否有一个现有的编译器标志(针对上述交叉编译器)使 libc 能够将“%zu”识别为 的格式说明符size_t?
$ cat ./main.c
// main.c
#include <stdio.h>
int main( int argc, char* argv[] )
{
size_t i = 42;
printf( "%zu\n", i );
return 0;
}
$ /path/to/mips_fp_le-gcc --version
2.95.3
$
$ file /path/to/libc.so.6
/path/to/libc.so.6: ELF 32-bit LSB pie executable, MIPS, MIPS-I version 1 (SYSV), dynamically linked, interpreter /lib/ld.so.1, for GNU/Linux 2.2.15, not …Run Code Online (Sandbox Code Playgroud) 当我在 CodeBlocks 中使用说明符 F 时,为什么编译器给我错误“格式参数太多”?
#include <stdio.h>
int main()
{
float x = 3.14159;
printf("%f\n", x);
printf("%F\n", x);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
错误:
#include <stdio.h>
int main()
{
float x = 3.14159;
printf("%f\n", x);
printf("%F\n", x);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 考虑以下 printf 指令:
\nprintf("%# 01.1g", 9.8);\nRun Code Online (Sandbox Code Playgroud)\n它应该打印什么?
\n我正在 cppreference.com 上阅读g说明符的描述,其中显示(已删除的文本G):
\n\n根据值和精度将浮点数转换为十进制或十进制指数表示法。
\n对于g转换,将执行带有e或f样式的样式转换。
\n
如果非零,则令 P 等于精度;如果未指定精度,则令 P 等于精度;如果精度为 \xe2\x80\x8b0\xe2\x80\x8b,则令 P 等于精度。那么,如果使用e类型的\n转换将具有 X 的指数:\n
\n- 如果 P > X \xe2\x89\xa5 \xe2\x88\x924,则转换采用样式f和精度 P \xe2\x88\x92 1 \xe2\x88\x92 X。
\n- 否则,转换采用样式e和精度 P \xe2\x88\x92 1。
\n除非请求替代表示,否则尾随零将被删除,如果没有留下小数部分,小数点字符也会被删除。
\n
在我们的例子中,
\nc ×8
printf ×7
scanf ×2
arguments ×1
c++ ×1
codeblocks ×1
input ×1
ios ×1
mips ×1
nsstring ×1
objective-c ×1
visual-c++ ×1