【2023.3.1】C语言复习笔记
0-说明
C语言笔记
只是记录一些我自己不熟悉的,并没有记录所有C语言知识点。
1-局部变量、全局变量、静态变量
局部变量:生命周期为第一个外部括号{}内,即作用域为第一个外部括号{}内。
若括号{}内的局部变量与{}外部局部变量重名,则{}内部局部变量优先。
全局变量:作用域全局
静态变量:static关键词,生命周期为第一次初始化到程序结束位置。
//静态变量示例:
#include<stdio.h>
void func() {
static int n = 4;
int m = 4;
printf("static int n=%d, int m=%d\n\n", n, m);
n++;
}
int main() {
func();
func();
func();
return 0;
}
2-选择排序、插入排序、冒泡排序
复杂度都是o(n^2);
选择排序
//每次选择最小的放在左端
//规定升序排序
void SelectionSort(int a[], int size) {
for (int i = 0; i < size-1; i++) {
int tempMin = i;
for (int j = i + 1; j < size; j++) {
if (a[j] < a[tempMin])
tempMin = j;
}
int temp = a[i];
a[i] = a[tempMin];
a[tempMin] = temp;
}
}
插入排序
//规定左端有序。
void InsertionSort(int a[], int size) {
//规定升序排序
for (int i = 1; i < size; i++) {
for (int j = 0; j < i; j++) {
if (a[j] > a[i]) {
int temp = a[i];
for (int k = i; k > j; k--) {
a[k] = a[k - 1];
}
a[j] = temp;
break;
}
}
}
}
冒泡排序
//规定右端有序
void BubbleSort(int a[], int size) {
//规定升序排序
for (int i = size - 1; i > 0; i--) {
for (int j = 0; j < i; j++) {
if (a[j] > a[j + 1]) {
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
}
3-联合体、枚举
联合体:union;
枚举:enum;
4-文件读写
FILE* fpOut = fopen("./Out.txt", "w");
fclose(fpOut);
//EOF:End Of File,值为-1;0xffffffff;
文本模式与二进制模式差别
主要是windows中有区别。
(1)文本文件读写
按文本格式读取,到内存中是文本字符的数字,而不是ascll码。
读取模式:r、w、a、r+、w+、a+
w:如果已存在同名文件,则原文件丢失,新建同名文件;
a: 打开一个文本文件,以追加模式写入文件,即文件指针指向文件末尾。
菜鸟教程:fscanf:从文件指针读取数据,到内存。按照格式
int fscanf(FILE *stream, const char *format, ...);
fscanf(fp, "%s %s %s %d", str1, str2, str3, &year);
while (fscanf(fpIn, "%d", a + n) != EOF) {
n++;
}
//返回值:如果成功,该函数返回成功匹配和赋值的个数。
// 如果到达文件末尾或发生读错误,则返回 EOF。
菜鸟教程:fprintf:从内存读取数据 写到文件中。按照格式。
int fprintf(FILE *stream, const char *format, ...);
fprintf(fp, "%s %s %s %d", "We", "are", "in", 2014);
for (int i = 0; i < n; i++) {
fprintf(fpOut, "%d\n", a[i]);
}
菜鸟教程:fgetc:从指定的流 stream 获取下一个字符(ascll码)
int fgetc(FILE *stream);
//返回值:读取字符的ascll码
//如果到达文件末尾或发生读错误,则返回 EOF。
//只读取一字节,但返回值必须用int存放。
//读取失败返回EOF,即文件末尾时。
菜鸟教程:fgets:从指定的流 stream 读取一行。
char *fgets(char *str, int n, FILE *stream);
//返回值:如果成功,该函数返回相同的 str 参数。
//到达文件行末尾、没有读取到任何字符,则返回NULL
菜鸟教程:futc:把一个(无符号)字符(ascll码)写入到指定的流 stream 中
int fputc(int char, FILE *stream);
//指写入一字节,即int型变量char(4字节)的低8位。
菜鸟教程:fputs:把字符串写入到指定的流 stream 中,但不包括空字符。
int fputs(const char *str, FILE *stream);
(2)二进制文件读取
读取文件存储的数据时,一定要二进制模式,即rb(w+b)
按二进制格式读取,读取到内存中为各个字符的ascll码。
读取模式:rb、wb、ab、r+b、w+b、a+b
菜鸟教程:fread:从给定流 stream 读取数据到指针 ptr 所指向的内存中。
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
//ptr -- 内存指针 这是指向带有最小尺寸 size*nmemb 字节的内存块的指针。
//size -- 这是要读取的每个元素的大小,以字节为单位。
//nmemb -- 这是元素的个数,每个元素的大小为 size 字节。
//stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输入流。
//返回值:成功读取size个字节的数量,即成功读取多少组size字节。
菜鸟教程:fwrite:把 指针ptr 所指向的内存中的数据写入到给定流 stream 中
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
//ptr -- 内存指针 这是指向要被写入的元素数组的指针。
//size -- 这是要被写入的每个元素的大小,以字节为单位。
//nmemb -- 这是元素的个数,每个元素的大小为 size 字节。
//stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输出流。
菜鸟教程:fseek:设置流 stream 的文件位置为给定的偏移 offset
int fseek(FILE *stream, long int offset, int whence);
//offset指偏移
//whence一般三种常量
// SEEK_SET 文件的开头
// SEEK_CUR 文件指针的当前位置
// SEEK_END 文件的末尾
菜鸟教程:ftell: 返回给定流 stream 的当前文件位置。
long int ftell(FILE* stream);
//返回 位置标识符的当前值,即文件指针距离文件头的偏移
fseek和ftell常用于获取文件大小
fseek (pFile, 0, SEEK_END);//文件指针指向文件末尾
int FileSize=ftell (pFile);
fseek (pFile, 0, SEEK_SET);//文件指针回到开头