在研究如何printf()在C中执行跨平台格式字符串时(也就是说,考虑到我希望每个整数参数printf()应该是的位数),我在维基百科文章的这一部分中进行了讨论printf().本文讨论了可以传递给printf()格式化字符串的非标准选项,例如(似乎是特定于Microsoft的扩展):
printf("%I32d\n", my32bitInt);
Run Code Online (Sandbox Code Playgroud)
它接着说:
ISO C99包括inttypes.h头文件,其中包含许多用于独立于平台的printf编码的宏.
...然后列出一组可在所述标题中找到的宏.查看头文件,使用它们我必须写:
printf("%"PRId32"\n", my32bitInt);
Run Code Online (Sandbox Code Playgroud)
我的问题是:我错过了什么吗?这真的是标准的C99方式吗?如果是这样,为什么?(虽然我从未见过以这种方式使用格式字符串的代码并不感到惊讶,因为它看起来很麻烦......)
我这样使用snprintf以避免缓冲区溢出:
char err_msg[32] = {0};
snprintf(err_msg, sizeof(err_msg) - 1, "[ ST_ENGINE_FAILED ]");
Run Code Online (Sandbox Code Playgroud)
-1如果字符串长度超过32个字节,我为null终止符添加了保留空间.
我的想法是否正确?
平台:
您可以使用printf字段宽度说明符截断字符串:
printf("%.5s", "abcdefgh");
> abcde
Run Code Online (Sandbox Code Playgroud)
遗憾的是它不换号(更换工作d用x是一样的):
printf("%2d", 1234); // for 34
printf("%.2d", 1234); // for 34
printf("%-2d", 1234); // for 12
printf("%-.2d", 1234); // for 12
> 1234
Run Code Online (Sandbox Code Playgroud)
是否有一种简单/平凡的方式来指定要打印的位数,即使它意味着截断数字?
MSDN明确表示不会发生这种不必要的限制.(是的,它可以通过创建字符串等来完成,但我希望有一个"printf技巧"或聪明的kludge.)
我想知道我怎么能这样做,在CI中使用printf打印一定数量的空格正在考虑这样的事情,而且我的代码在第一个printf语句之后没有打印,我的程序编译完全很好.我猜我必须打印N-1个空格,但我不太清楚如何这样做.
谢谢.
#include <stdio.h>
#include <limits.h>
#include <math.h>
int f(int);
int main(void){
int i, t, funval,tempL,tempH;
int a;
// Make sure to change low and high when testing your program
int low=-3, high=11;
for (t=low; t<=high;t++){
printf("f(%2d)=%3d\n",t,f(t));
}
printf("\n");
if(low <0){
tempL = low;
tempL *=-1;
char nums[low+high+1];
for(a=low; a <sizeof(nums)/sizeof(int);a+5){
printf("%d",a);
}
}
else{
char nums[low+high];
for(a=low; a <sizeof(nums)/sizeof(int);a+5){
printf("%d",a);
}
}
// Your code here...
return 0;
}
int f(int t){
// example 1
return (t*t-4*t+5);
// example …Run Code Online (Sandbox Code Playgroud) 可能重复:
如何在C中打印"unsigned long"?
我有这样的号码......
int unsigned long number = 600851475143;
Run Code Online (Sandbox Code Playgroud)
我正在尝试打印它printf().每次我尝试,我都会收到编译器的警告.
我试过了%uld,%ld谷歌搜索似乎没有找到答案.
我正在学习C,但之前没有使用long int过,所以我不确定我应该使用什么.
我追逐的说明者是什么?
也许我只是错过了它,但是没有一个函数等同于文件描述符的fprintf,甚至是一种暂时在它们之间翻转的方法?
我正在研究一个使用套接字的简单的Blackjack游戏,这是我操作系统类的礼貌.我们获得了一个套接字接口,它已经来回传递一个字符数组.
我希望我可以这样做:
char[] msgOut = printf("Dealer's Card is %C %C", char1, char2);
sendMsg(msgOut);
Run Code Online (Sandbox Code Playgroud)
然而,谷歌搜索引导我确定printf的返回值是Char的输出数量的int,而不是 chars本身的char [](正如我所希望的那样).
是否有另一个C函数可以让我从变量中构建字符串?
我需要显示一个包含数组价格的项目列表,并希望调整价格.我几乎让它工作但需要改进.下面是代码和输出.任何想法如何使所有价格一致?到目前为止有些工作,但有些工作没有.提前致谢.
//for loop
System.out.printf("%d. %s \t\t $%.2f\n",
i + 1, BOOK_TYPE[i], COST[i]);
Run Code Online (Sandbox Code Playgroud)
输出:
1. Newspaper $1.00
2. Paper Back $7.50
3. Hardcover book $10.00
4. Electronic book $2.00
5. Magazine $3.00
Run Code Online (Sandbox Code Playgroud) 在最近的一个问题中,有人提到当使用printf打印指针值时,调用者必须将指针强制转换为void*,如下所示:
int *my_ptr = ....
printf("My pointer is: %p", (void *)my_ptr);
Run Code Online (Sandbox Code Playgroud)
对于我的生活,我无法弄清楚为什么.我发现了这个问题,几乎是一样的.问题的答案是正确的 - 它解释了整数和指针的长度不一定相同.
这是当然的,真实的,但是当我已经在的情况下有一个指针,像上面,我为什么要由铸铁int *到void *?什么时候int*与void*不同?事实上,什么时候(void *)my_ptr生成任何与简单不同的机器代码my_ptr?
更新:多个知识渊博的响应者引用了标准,说传递错误的类型可能会导致未定义的行为.怎么样?我期望printf("%p", (int *)ptr)并printf("%p", (void *)ptr)生成完全相同的堆栈帧.两个调用何时生成不同的堆栈帧?
目标:将数据序列化为JSON.
问题:我事先不知道整数是多少个字符.
我认为这样做的一个好方法是使用 sprintf()
size_t length = sprintf(no_buff, "{data:%d}",12312);
char *buff = malloc(length);
snprintf(buff, length, "{data:%d}",12312);
//buff is passed on ...
Run Code Online (Sandbox Code Playgroud)
当然我可以使用堆栈变量char a[256]代替no_buff.
问题:但是在C中是否存在像unix这样的一次性写入的实用程序/dev/null?像这样的Smth:
#define FORGET_ABOUT_THIS ...
size_t length = sprintf(FORGET_ABOUT_THIS, "{data:%d}",12312);
Run Code Online (Sandbox Code Playgroud)
ps我知道我也可以通过日志获得整数的长度,但这种方式似乎更好.