C语言期末复习

库函数汇总

I/O

标准流

int printf(const char *format, ...); // 返回成功输出的字符数量,失败返回负数,一般为-1
int scanf(const char *format, ...); // 返回成功读入的变量个数
scanf("%s", s); // 1
// 读入失败,没有符合格式的输入
scanf("%d", &x); // 输入:aaa,返回0
// 读入失败,文件末尾
scanf("%d", &x); // 没有输入,返回EOF
int getchar(); // 读取失败返回EOF
int putchar(int ch); // 成功返回ch, 失败返回EOF
int puts(const char* str); // 成功返回非负值,失败返回EOF
// 注意puts会把'\0'替换成'\n'输出
char * gets(char * str); // 读取成功返回str,失败返回NULL
// 读入到换行或者EOF为止,换行会被替换成'\0'储存

字符串

sscanf(buf, "...", ...); // buf表示从buf字符串读入,其它和scanf一模一样
sprintf(buf, "...", ...); // buf表示输出到buf字符串,其它和printf一模一样

文件

int fgetc(FILE* file); // 从file读入字符,返回值和getchar一样
int fputc(int ch, FILE* file); // 输出ch到file,返回值和putchar一样
char *fgets(char *str, int count, FILE *file);
// 从file读取一个字符串到str,最多count个字符存入str
// 至少有一个字符读取了,就返回str,否则返回NULL,且原str的值不会被修改
// count是包含了结束符'\0'的,遇到换行符或者EOF会停止读取,会存下换行符
int fputs(char *str, FILE* file); // 写入str到文件file中,不会替换'\0'为'\n'
// 返回值与puts相同,成功时都是返回非负值,具体实现取决于编译器
size_t fread(void *buffer, size_t size, size_t count, FILE *fp);
// 从fp中读取最多count个size大小的变量,储存到buffer为首地址的连续内存中
// 返回成功读入的变量个数,可能小于count
size_t fwrite(void *buffer, size_t size, size_t count, FILE *fp);
// 以buffer为首地址(类似一个数组),取count个size大小的变量写入fp中
// 返回成功写入的变量个数,可能小于count

字符串

char *strcpy(char *dest, const char *src);
// src需要以'\0'结尾,将src复制到dest,dest必须有足够多的内存空间存储,否则行为未定义
// 返回dest
char *strcat(char *dest, const char *src);
// 同上,dest和src是两个以'\0'结尾的字符串,将src连接到dest后面:替换掉'\0'
// 返回dest
int strcmp(const char *str1, const char *str2);
// 字符串比较函数,str1 < str2 返回负数,str1 == str2 返回0, str1 > str2 返回正数
size_t strlen(const char *str);
// 返回字符串长度,不含'\0'

文件操作

  1. 打开/关闭文件:
FILE * fopen(char * file_name, char * method); // 成功打开文件返回文件指针,否则返回NULL

method的含义:
![[fopen参数.png]]

int fclose(FILE * fp); // 正常关闭返回0,无法正常关闭文件返回非0值
  1. 操作光标:
#define SEEK_SET 0
#define SEEK_CUR 1 
#define SEEK_END 2
// 文件开头:0,当前位置:1,文件末尾:2

int fseek(FILE *fp, long offset, int whence);
// 将fp从whence位置移动offset个位置,0相当于没动,可以理解为字符数组下标的加减
// 成功返回0,不成功返回非0
long ftell(FILE *stream);
// 返回当前光标位置(可以理解成字符数组中的目前下标)
// 失败返回-1L
void rewind(FILE *fp);
// 等价与 fseek(fp, 0, SEEK_SET); 然后清除错误标志
int feof(FILE *fp);
// 未达到文件末尾:0,达到了:非0
int ferror(FILE *fp);
// 有错误:非0,没错误:0
void clearerr(FILE *fp);
// 清楚错误标志和文件结束标志

动态内存分配

文件

文本文件与二进制文件

其实所有文件都是二进制形式存储的,所谓的“文本文件”是指,通过格式化输出的方式,将二进制形式的数据转换成字符形式,再按照字符形式储存。这个原理和 printf 其实是一样的,比如 printf("%d", x); 就是把二进制储存的 int 类型变量,转换成了十进制输出,输出的其实是一对字符。
C语言中的文件是数据流(由一个个的字节数据组成),相应地,文本文件对应着字符流,二进制文件对应了二进制流。

文件I/O

  • 通用:fputc/fgetc, fputs/fgets
  • 文本文件特有:fscanf, fprintf
  • 二进制文件特有:fread, fwrite

文件的特点

  • 数据永久保存
  • 数据长度不定
  • 数据按顺序存取

文件缓冲区

  1. 设计原因:由于磁盘速度慢,直接将数据写入磁盘效率很低。
  2. 文件会被加载到缓冲区,作为一个中间介质,程序只操作内存中的文件缓冲区,缓冲区到磁盘的操作由操作系统自动完成。
  3. 操作系统通过文件控制块(FCB)操作文件。

光标移动

  • 需要注意,SEEK_END是文件最后一个字符的下一个位置,如果把文件理解成char str[M]; 那么SEEK_END 就是 M
  • 读取/写入了一个字符之后,光标会自动往后移动到第一个没被操作的位置。
  • a+模式打开文件,读取文件是从文件头读取,但是一旦进行写入操作,光标会自动移到SEEK_END,如果还有读取文件,需要重置光标。

杂项

  • C语言允许打开多个文件,但不允许重复打开已经打开过的文件。

错题集合

  1. 注意程序填空里面,如果是文件读写,不要错写成 scanf 或者 sscanf
  2. 特殊的转义:\八进制,可以有0~3位八进制数字,\x十六进制, 十六进制可以是一到多位,是贪婪匹配。并且 \x 不区分
  3. 注意区分0O/o1l
  4. 循环嵌套关注内外层循环变量是否重名!
  5. %p 以十六进制输出指针
  6. 不是所有变量都可以互相赋值然后隐式转换,比如指针和浮点型变量。
  7. 标识符和变量名不一样,关键字是系统保留的标识符,也就是说 continue 虽然不能作为变量名,但是是合法的标识符。
  8. 'A' 'a' '0'的值分别是65 97 48
  9. 浮点数表示形式:
  10. 注意位运算左移右移的优先级是比+/-低,但是比< <= > >=高的,其它位运算优先级均位于!= ==后面。
  11. qsort的比较函数要求返回:
  • 负数:第一个参数小于第二个参数
  • :两个参数相等
  • 正数:第一个参数大于第二个参数
    原型void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*));
  • base:指向要排序数组的第一个元素的指针
  • nitems:数组中元素的数量
  • size:每个元素的大小(以字节为单位)
  • compar:比较函数的指针
  1. 浮点数的表示方法:
1.2
0.3
.3
4.0
4.
小数e/E整数 科学计数法
小数可以按照上面的规则省略
scanf输入也是按照这些规则读入浮点数
  1. 注意循环语句/条件判断语句后面是不是直接跟了分号。
  2. 一定要注意循环体中有没有对循环变量作修改。
  3. for里面给的循环边界不一定是结束情况:
for (i = 11; i >= 1; i -= 3) {
	for(j = 1; j <= i; j += 2);
		sum += i * j, sum = i + j;
}

首先,i最后结束循环的值是-1,最后依次循环的i2,而且内层循环后面又加上了分号,所以j3,答案应该是5
这也告诉我们,遇到循环的题目无论如何都要先检查有没有多余分号

  1. switch语句中,会先匹配case,每一个case都无法匹配才会执行default,也就是default不是全部情况都会执行,它是case的补集。
switch (x) {
	default: putchar('D');
	case 1: putchar('1');
}

x==1 的时候,不会执行default语句。
17. qsortcount, sizefread/fwrite反过来了。
18. 注意试卷上printf输出的空格很小很小,一定要注意看印刷出来有没有空格。
19. 注意区分大小写字母,有可能只对大写/小写字母有处理,不要混为一谈。
20. 程序填空题注意一个函数会不会莫名奇妙多了返回值,那么它可能作为其他函数的参数……
21. 注意strlen 返回的事无符号整数,所以小心(unsigned int)(-1) < 0这种荒谬的事情发生
22. 函数指针很特殊,解任意次引用都没区别。
23. 声明写了static,定义可以省略,但是声明没写static,定义就不能写static

posted @ 2026-03-02 13:16  Zlc晨鑫  阅读(26)  评论(0)    收藏  举报