本文记录在学习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的输出涉及前缀后缀++ --,不同的编译器实现不同,下面这篇文章中的第一个回答给出了解释: