标签: printf

为什么不是新的(特定于位宽)printf()格式选项字符串作为C99的一部分?

在研究如何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方式吗?如果是这样,为什么?(虽然我从未见过以这种方式使用格式字符串的代码并不感到惊讶,因为它看起来很麻烦......)

c printf types c99 format-specifiers

17
推荐指数
2
解决办法
7350
查看次数

使用snprintf避免缓冲区溢出

我这样使用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终止符添加了保留空间.

我的想法是否正确?

平台:

  • GCC 4.4.1
  • C99

c printf

17
推荐指数
3
解决办法
3万
查看次数

为数字指定最大printf字段宽度(必要时截断)?

您可以使用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.)

printf truncate format-specifiers

17
推荐指数
2
解决办法
3万
查看次数

在C中使用printf打印空格数

我想知道我怎么能这样做,在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 printf

17
推荐指数
1
解决办法
4万
查看次数

如何在C中使用printf打印unsigned long int?

可能重复:
如何在C中打印"unsigned long"?

我有这样的号码......

int unsigned long number = 600851475143;
Run Code Online (Sandbox Code Playgroud)

我正在尝试打印它printf().每次我尝试,我都会收到编译器的警告.

我试过了%uld,%ld谷歌搜索似乎没有找到答案.

我正在学习C,但之前没有使用long int过,所以我不确定我应该使用什么.

我追逐的说明者是什么?

c printf

16
推荐指数
2
解决办法
9万
查看次数

用于文件描述符的"fprintf"函数(即int fd而不是FILE*fp)

也许我只是错过了它,但是没有一个函数等同于文件描述符的fprintf,甚至是一种暂时在它们之间翻转的方法?

c file-io printf posix-api

16
推荐指数
2
解决办法
1万
查看次数

从C中的变量构建字符串

我正在研究一个使用套接字的简单的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函数可以让我从变量中构建字符串?

c string printf

16
推荐指数
2
解决办法
4万
查看次数

用Java对齐printf输出

我需要显示一个包含数组价格的项目列表,并希望调整价格.我几乎让它工作但需要改进.下面是代码和输出.任何想法如何使所有价格一致?到目前为止有些工作,但有些工作没有.提前致谢.

//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)

java printf text-align alignment

16
推荐指数
3
解决办法
10万
查看次数

printf("%p")并转换为(void*)

在最近的一个问题中,有人提到当使用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)生成完全相同的堆栈帧.两个调用何时生成不同的堆栈帧?

c printf pointers

16
推荐指数
5
解决办法
2705
查看次数

如何计算sprintf将产生的输出长度?

目标:将数据序列化为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我知道我也可以通过日志获得整数的长度,但这种方式似乎更好.

c printf

16
推荐指数
3
解决办法
9852
查看次数