本文记录在学习linux c编程中遇到的printf相对新奇少见的用法,常见用法在此不一一罗列。

/* Listing 12-1 */

#include <fcntl.h>
#include "tlpi_hdr.h"

#define MAX_LINE 100

int
main(int argc, char *argv[])
{
    int fd;
    char line[MAX_LINE];
    ssize_t n;

    fd = open("/proc/sys/kernel/pid_max", (argc > 1) ? O_RDWR : O_RDONLY);
    if (fd == -1)
        errExit("open");

    n = read(fd, line, MAX_LINE);
    if (n == -1)
        errExit("read");

    if (argc > 1)
        printf("Old value: ");
    printf("%.*s", (int) n, line);

    if (argc > 1) {
        if (lseek(fd, 0, SEEK_SET) == -1)
            errExit("lseek");

        if (write(fd, argv[1], strlen(argv[1])) != strlen(argv[1]))
            fatal("write() failed");

        system("echo /proc/sys/kernel/pid_max now contains "
               "`cat /proc/sys/kernel/pid_max`");
    }

    exit(EXIT_SUCCESS);
}

printf("%.*s", (int) n, line)这种用法相对少见,n此处是控制字符串line的长度。
表示从字符串line中最多打印n个字符。
参考K&&R《C语言程序设计》
负号:用于指定被转换的参数按照左对齐的形式输出
数:用于指定最小字段宽度。转换后的参数将打印不小于最小字段宽度的字段。
小数点:用于将字段宽度和精度分开

#include<stdio.h>
int main()
{
  int a;
  printf("I am shivam %nsharma ", &a);       
  printf("%d", a);
 return 0;
} 

程序输出:I am shivam sharma 12

最开始看到这个程序的时候怀疑是代码写错了,常见的形式难道不是\n换行符吗?
后来在stackoverflow看到了如下解释:
%n says print nothing, rather store the number of characters written so far into the memory address of a.
中文解释:%n在这里不会输出打印,只是把遇到%n时前面的字符个数的值存入变量a,上面例子中由于遇到%n时前面已经有12个字符,所以把变量a的值设置为12.
例子:

/* sscanf example */
#include <stdio.h>

int main ()
{
  char sentence []="Rudolph is 12 years old";
  char str [20];
  int i;

  sscanf (sentence,"%s %*s %d",str,&i);
  printf ("%s -> %d\n",str,i);
  
  return 0;
}

%*s的作用是忽略字符串,然后将12保存到int变量i中。

假如 a=5 printf ("%d %d %d", a++, a++, ++a)输出?
这道题目是公司同事在微信问到的,对于printf的输出涉及前缀后缀++ --,不同的编译器实现不同,下面这篇文章中的第一个回答给出了解释:
printf Quora中解释