打印指针地址%d和%u打印时有什么区别?
例如:
int a = 5;
// check the memory address
printf("memory address = %d\n", &a); // prints "memory address = -12"
printf("memory address = %u\n", &a); // prints "memory address = 65456"
Run Code Online (Sandbox Code Playgroud) 如果我使用不好的术语,请提前道歉.
当我在gdb下编译一个C++应用程序并使用printf()时,它给出了与格式字符串的一致性和传入的参数有关的令人敬畏的警告.
例如,这段代码:
printf("%s %s", "foo");
Run Code Online (Sandbox Code Playgroud)
导致编译器警告"格式参数太少",这非常有用.它还会提供有关格式字符串类型与参数类型的警告.它必须检查格式字符串并将其与提供的参数类型进行比较. - 这种编译时内省可以添加到普通源代码中,还是需要编译成gcc本身的东西?
fwiw这是在os x的gcc 4.2.1下.
我试图弄清楚如何使用sprintf打印至少两个小数位并且没有前导零.例如
输入:
23
23.0
23.5
23.55
23.555
23.0000
Run Code Online (Sandbox Code Playgroud)
输出:
23.00
23.00
23.50
23.55
23.555
23.00
Run Code Online (Sandbox Code Playgroud)
任何格式化帮助将不胜感激
我在文本文件中插入时间有问题.我使用下面的代码,我得到|21,43,1,3,10,5| Wed Feb 01 20:42:32 2012哪些是正常的,但我想要做的是把数字之前的时间放在例如像,Wed Feb 01 20:42:32 2012 |21,43,1,3,10,5|但是,我不能这样做因为当我使用fprintf与ctimef函数之前fprintf它识别的数字\n在ctime内,因此它更改第1行然后打印数字.它像:
Wed Feb 01 20:42:32 2012
|21,43,1,3,10,5|
Run Code Online (Sandbox Code Playgroud)
这是我不想要的东西......我如何能够在没有切换到文本中的下一行的情况下缩短时间?提前致谢!
fprintf(file," |");
for (i=0;i<6;i++)
{
buffer[i]=(lucky_number=rand()%49+1); //range 1-49
for (j=0;j<i;j++)
{
if (buffer[j]==lucky_number)
i--;
}
itoa (buffer[i],draw_No,10);
fprintf(file,"%s",draw_No);
if (i!=5)
fprintf(file,",");
}
fprintf(file,"| %s",ctime(&t));
Run Code Online (Sandbox Code Playgroud) 有人可以解释这种行为吗?我很清楚浮点数的机器级表示.这似乎与printf及其格式有关.两个数字都用浮点表示法精确表示(检查:乘以64得到一个整数).
#include <stdio.h>
#include <iostream>
using namespace std;
int main() {
double x1=108.765625;
printf("%34.30f\n", x1);
printf("%9.5f\n", x1);
printf("%34.30f\n", x1*64);
double x2=108.046875;
printf("%34.30lf\n", x2);
printf("%9.5f\n", x2);
printf("%34.30f\n", x2*64);
}
Run Code Online (Sandbox Code Playgroud)
输出:
> 108.765625000000000000000000000000
> 108.76562
> 6961.000000000000000000000000000000
> 108.046875000000000000000000000000
> 108.04688
> 6915.000000000000000000000000000000
Run Code Online (Sandbox Code Playgroud)
注意,第一个数字向下舍入,第二个数字向上舍入.
阅读这个问题,我开始想知道 - 使用scanf/ printf(和系列)固定大小类型的正确方法是什么?
举例来说,如果我有short int或者int,我会使用%hd,并%d分别-罚款.
但如果我有int16_t什么?short int可能与之不同int16_t,它取决于平台.任何其他固定尺寸(整体)类型都一样吗?
注意:因为看起来我收到了一些向下投票,因为我"没有尝试谷歌这个 ",看起来我需要解释:我没有在这里看到类似的问题,这就是我发布它的原因.SO中的大部分问题都可以通过谷歌回答,而不是在这里问.那将使StackOverflow成为现实,它实际上就是现在.
不,我没有这样做是为了声誉 - 我今天已经达到每日声望上限(在发布此问题之前有24票).
我的观点是 - 我认为这不值得投票.
我从我设计的东西这里有一小段代码,但我一直在获取未在范围内声明的错误sprintf?
我是否在#includes中包含了一些内容,或者我如何才能使其正常工作?我在我妈妈的VS上工作,但回到家里,我不能在代码块上得到它
if (tmp2 <= B_dest[hr - 6])
{
sprintf(name, "B%d", tmp3);
}else{
sprintf(name, "A%d", tmp3);
}
Run Code Online (Sandbox Code Playgroud) 众所周知,当你printf用来输出a的值时,你的精度有限float.
但是,有一个技巧可以提高输出的准确性,如下例所示:
#include <stdio.h>
int main()
{
float f = 1318926965; /* 10 random digits */
printf("%10.f\n", f); /* prints only 8 correct digits */
printf("%10d\n", *(int*)&f); /* prints all digits correctly */
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,为什么人们不经常使用这个技巧?
任何人都可以解释一下[.precision]printf 如何使用说明符"%g"吗?我对以下输出感到困惑:
double value = 3122.55;
printf("%.16g\n", value); //output: 3122.55
printf("%.17g\n", value); //output: 3122.5500000000002
Run Code Online (Sandbox Code Playgroud)
我已经知道%g使用最短的表示法.
但以下的输出仍然让我感到困惑
printf("%.16e\n", value); //output: 3.1225500000000002e+03
printf("%.16f\n", value); //output: 3122.5500000000001819
printf("%.17e\n", value); //output: 3.12255000000000018e+03
printf("%.17f\n", value); //output: 3122.55000000000018190
Run Code Online (Sandbox Code Playgroud)
我的问题是:为什么%.16g给出确切的数字而%.17g不能?
似乎16位有效数字可以准确.谁能告诉我原因?
#include <stdio.h>
int main(void) {
int i;
scanf("%d", &i);
if(i != 30) { return(0); }
printf("i is equal to %d\n", i);
}
Run Code Online (Sandbox Code Playgroud)
看来结果字符串将始终以"i等于30",那么,为什么不GCC优化此调用与一个调用printf puts(),或者write(),例如?
(刚刚检查了生成的程序集,使用gcc -O3(版本5.3.1),或者在Godbolt Compiler Explorer上)