C语言--格式化输入/输出函数(printf/scanf,fprintf/fscanf,sprintf,sscanf)

时间:2022-10-25 12:33:52

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;
}

C语言--格式化输入/输出函数(printf/scanf,fprintf/fscanf,sprintf,sscanf)

基本应用
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;
}

C语言--格式化输入/输出函数(printf/scanf,fprintf/fscanf,sprintf,sscanf)


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()函数同样返回了本次函数调用最终打印到字符缓冲区中的字符树目。


4、sscanf