7.1 标准输入/输出

获取一个字符:

  1. int getchar(void);

输入重定向:

  • <infile 并不包含在 argv 中
  1. prog <infile

通过管道重定向标准输入:

  1. otherprog | prog

输出一个字符:

  1. int putchar(int);

重定向:

  1. prog >输出文件名
  2. prog | anotherprog

使用输入/输出函数前需要包含头文件:

  1. #include <stdio.h>

7.2 格式化输出 - printf 函数

image.png

  • 返回值为打印的字符数

在%和转换字符中间可能包含的部分:

image.png

image.png

可以在参数列表中指定打印宽度:

  1. printf("%.*s", max, s);

不同宽度对字符串的作用效果:

image.png

image.png

  • 将格式化的字符串保存到指定位置

7.3 变长参数表

  1. int printf(char *fmt, ...);
  • 省略号只能在参数表表尾
  • 中定义了可处理变长参数表的宏定义
    • va_list
    • va_start
    • va_arg
    • va_end

image.png

猜测: va_start() 根据 fmt 中的格式符 (%) 来初始化 ap 数组的大小, va_arg 将 ... 参数保存到 ap 中, va_end() 进行清理. 这里有个疑惑点是没有看到将 ... 传递给 va_arg(), 它就能解析.

7.4 格式化输入 - scanf 函数

  1. // 返回值, 成功解析的项数
  2. int scanf(char *format, ...)
  1. // 从一个字符串解析
  2. int sscanf(char *string, char *format, arg1, arg2, ...)

格式串的组成:

image.png

image.png
image.png

image.png

image.png

输入必须和格式串的的匹配:

image.png

7.5 文件访问

文件指针:

  1. <stdio.h>
  2. FILE *fp;
  3. FILE *fopen(char *name, char *mode);

读写字节:

  1. int getc(FILE *fp);
  2. int putc(int c, FILE *fp)

image.png

  • stdin, stdout 是 FILE * 类型
  • 调用 fclose() 是必要的, 它将 putc() 的缓存写到文件中

7.6 错误处理 - stderr 和 exit

将 stdout, stderr 分离:

image.png

  • exit 为每个打开的文件调用 fclose().
  • 如果流 fp 中出现错误, ferror() 返回一个非0值

7.7 行输入和行输出

  1. char *fgets(char *line, int maxline, FILE *fp);
  2. int fputs(char *line, FILE *fp);

7.8 其他函数

7.8.1 字符串操作函数

image.png

7.8.2 字符类别测试和转换函数

image.png

7.8.3 ungetc 函数

  1. // 将字符 c 协会到文件 fp 中
  2. // 每个文件只能接收一个写回字符
  3. int ungetc(int c, FILE *fp)

7.8.4 命令执行函数

应该是调用其他程序.

  1. int system(char* s);
  2. system("date");

7.8.5 存储管理函数

动态分配存储快:

  1. void *malloc(size_t n);
  2. void *calloc(size_t n, size_t size);
  1. int *ip;
  2. ip = (int *) calloc(n, sizeof(int));

释放空间:

  1. // 释放的必须是由 malloc/calloc 分配的空间
  2. free(p);

7.8.6 数学函数

image.png
image.png

7.8.7 随机数发生器函数

rand():

  • 0~RAND_MAX ()

生成大于等于0, 但小于1的浮点数:

  1. #define frand() ((double) rand() / (RAND_MAX+1.0))

设置种子:

  1. srand(unsigned)