首页 C语言 printf与scanf
文章
取消

C语言 printf与scanf

printf()系列

头文件:stdio.h、stdarg.h

  • int printf(const char *fmt, ...);:输出至stdout
  • int fprintf(FILE *stream, const char *fmt, ...);:输出至stream
  • int sprintf(char *str, const char *fmt, ...);:输出至str
  • int snprintf(char *str, size_t size, const char *fmt, ...);:输出至str,写入至多size个字符(包括’\0’字符)
  • int vprintf(const char *fmt, va_list ap);:fmt从变参列表ap获取数据,然后输出至stdout
  • int vfprintf(FILE *stream, const char *fmt, va_list ap);:fmt从变参列表ap获取数据,然后输出至stream
  • int vsprintf(char *str, const char *fmt, va_list ap);:fmt从变参列表ap获取数据,然后输出至str
  • int 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格式化,赋值给ap
  • int vfscanf(FILE *stream, const char *fmt, va_list ap);:从stream获取源数据,然后根据fmt格式化,赋值给ap
  • int 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
本文由作者按照 CC BY 4.0 进行授权

C语言 内存管理

C语言 断言