1、printf/scanf
函数说明
printf()将输出按指定格式放置在标准输出流stdout上,函数声明如下:
int printf(const char *,...);
scanf()可以从标准的输入流stdin中按指定的格式读取数据,函数声明如下:
int scanf(const char *,...);
printf()函数和scanf()函数均为可变参数函数,printf()函数返回值为输出的信息个数。
#include <stdio.h>
#include <string.h>
int main(void) {
int i;
char a[10];
printf("input string:");
scanf("%s", a);
i = printf("the string is:%s\n", a);
printf("the last printf return %d\n", i);
return 0;
}
基本应用
1. 打印字符:printf("%c",c);
2. 打印整型:printf("%d",i);
printf("%u",i);
3. 打印浮点数:printf("%f",f);
4. 打印指针: printf("%f",f);
5. 打印八进制数和十六进制数: printf("%x",i);
printf("%o",i);
6. 忽略某些位(%*):
#include <stdio.h>
#include <string.h>
int main(void) {
int a, b;
scanf("%2d%*2d%1d", &a, &b);
printf("%d\n", a - b);
return 0;
}
2、fprintf/fscanf
函数说明
fprintf()/fscanf()函数和printf()/scanf()函数的主要区别在于printf()/scanf()函数专门针对标准输入、输出流,而fprintf()/fscanf()函数可用于任意流,当然也包括标准的输入、输出流,扩展了范围。
fprintf()将输出按指定格式放置在指定的输出流上。
int fprintf(FILE *, const char *, ...);
fscanf()从指定的输入流中按指定的格式读取数据。
int fscanf(FILE *, const char *, ...);
基本应用
从某个流输出:
#include <stdio.h>
#include <string.h>
int main(void) {
char buf[] = "test";
FILE *fp;
fp = fopen("test", "w");
fprintf(stdout, "%s", buf);
fprintf(fp, "%s", buf);
return 0;
}
向某个流输入:
#include <stdio.h>
#include <string.h>
int main(void) {
char c;
FILE *fp;
fp = fopen("test", "r");
fprintf(stdin, "%c", &c);
fprintf(fp, "%c", &c);
return 0;
}
3、sprintf
sprintf()主要针对字符串的操作,同样是变参函数,该函数声明如下:
int sprintf( char *buffer, const char *format, [argument]...);
sprintf是将列出的数据或者变量(第3个及后面多个参数)以format的格式输出到以buffer为起始位置的内存空间中。
1. 数字字符串的操作:
sprintf可以把整数打印到字符串中,在大多数场合可以替代itoa()函数。
/**把整数1234打印到字符串保存在s中**/
sprintf(s, "%d", 1234);
可以按照16进制打印:
sprintf(s, "%8x", 4567); //小写16进制,宽度占8个位置,右对齐
sprintf(s, "%-8X", 4567); //大写16进制,宽度占8个位置,左对齐
sprintf(s, "%08X", 4567); //左补零等8位宽度,16进制显示
2. 控制浮点数的打印格式:
浮点数的打印和格式控制是sprintf的又一大常用功能,浮点数使用格式符“%f”控制,默认保留小数点后6位数字。
sprintf(s, "%f", 3.1415923); //产生3.141593
/**其他格式的写法**/
sprintf(s, "%10.3f", 3.1415926); //(指定宽度10,小数点后3位,右对齐)产生3.142
sprintf(s, "%-10.3f", 3.1415926); //(指定宽度10,小数点后3位,左对齐)产生3.142
sprintf(s, "%.3f", 3.1415926); //(不指定总宽度,小数点后3位)产生3.142
3. 连接字符串:
sprintf可以连接字符串,在许多场合可以替代strcat()函数,而且sprintf能够一次连接多个字符。
char* who = "I";
char* whom = "China";
sprintf(s, "%s love %s.", who, whom); //产生:“I love China.”
在进行连接字符串尾部时,一般都有’\0’结束符,如果直接连接没有以‘\0’结束的两字符,不管是sprintf还是strcat都可能导致非法的内存操作。为解决这个问题,可以使用在打印时指定宽度来实现,如下:
char a1[] = {'A','B','C','D','E','F','G'};
char a1[] = {'H','I','J','K','L','M','N'};
sprintf(s, "%.7s%.7s", a1, a2); //产生:"ABCDEFGHIJKLMN"
4. 利用sprintf的返回值:
sprintf()函数同样返回了本次函数调用最终打印到字符缓冲区中的字符树目。