printf()系列
头文件:stdio.h、stdarg.h
int printf(const char *fmt, ...);
:输出至stdoutint fprintf(FILE *stream, const char *fmt, ...);
:输出至streamint sprintf(char *str, const char *fmt, ...);
:输出至strint snprintf(char *str, size_t size, const char *fmt, ...);
:输出至str,写入至多size个字符(包括’\0’字符)int vprintf(const char *fmt, va_list ap);
:fmt从变参列表ap获取数据,然后输出至stdoutint vfprintf(FILE *stream, const char *fmt, va_list ap);
:fmt从变参列表ap获取数据,然后输出至streamint vsprintf(char *str, const char *fmt, va_list ap);
:fmt从变参列表ap获取数据,然后输出至strint vsnprintf(char *str, size_t size, const char *fmt, va_list ap);
:fmt从变参列表ap获取数据,然后输出至str,写入至多size个字符(包括’\0’字符)
返回值:正常情况下,返回成功写入的字符数;若出错,则返回负值;
比如:我们可以利用vprintf()写一个自己的格式化输出函数,来模拟printf()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <stdarg.h>
int my_printf(const char *fmt, ...){
va_list ap;
va_start(ap, fmt);
int writec = vprintf(fmt, ap);
va_end(ap);
return writec;
}
int main(void){
my_printf("name: %s, age: %d, score: %.1f\n", "Otokaze", 18, 115.5);
return 0;
}
1
2
3
4
$ gcc a.c
$ ./a.out
name: Otokaze, age: 18, score: 115.5
scanf()系列
头文件:stdio.h、stdarg.h
int scanf(const char *fmt, ...);
:从stdin获取源数据,然后根据fmt格式化,赋值给变参列表int fscanf(FILE *stream, const char *fmt, ...);
:从stream获取源数据,然后根据fmt格式化,赋值给变参列表int sscanf(const char *str, const char *fmt, ...);
:从str获取源数据,然后根据fmt格式化,赋值给变参列表int vscanf(const char *fmt, va_list ap);
:从stdin获取源数据,然后根据fmt格式化,赋值给apint vfscanf(FILE *stream, const char *fmt, va_list ap);
:从stream获取源数据,然后根据fmt格式化,赋值给apint vsscanf(const char *str, const char *fmt, va_list ap);
:从str获取源数据,然后根据fmt格式化,赋值给ap
返回值:正常情况下,返回成功赋值的变量数目;若出错,则返回负值;
例如:利用vprintf()和vscanf()模拟printf()和scanf()函数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#include <stdarg.h>
int my_printf(const char *fmt, ...){
va_list ap;
va_start(ap, fmt);
int writec = vprintf(fmt, ap);
va_end(ap);
return writec;
}
int my_scanf(const char *fmt, ...){
va_list ap;
va_start(ap, fmt);
int readc = vscanf(fmt, ap);
va_end(ap);
return readc;
}
int main(void){
char name[20];
int age;
float score;
my_printf("input student's info: ");
my_scanf("%s %d %f", name, &age, &score);
my_printf("name: %s, age: %d, score: %.1f\n", name, age, score);
return 0;
}
1
2
3
4
5
$ gcc a.c
$ ./a.out
input student's info: Otokaze 18 114.5
name: Otokaze, age: 18, score: 114.5