1.字符串定义在只读数据段;字符保存在局部变量栈中。
2.字符串库函数:
int strlen(char *str);//求字符串str的长度
char * strcat(char *str1,const char *str2);//将str2拼接到str1后面
int strcmp(char *str1,char *str2);//比较str1和str2,相等返回0,str1大返回1,str1小返回-1
char * strtok(char *str,char *fengefu);//分隔符为一个字符串,可以有多个分隔符,将str进行分割,返回分割后的字符串。通过:
char *p=strtok(str,":,");
printf("%s\n",p);
while((p=strtok(NULL,":,"))!=NULL)
printf("%s\n",p);
3.通过“”(双引号)定义的字符指针是一个常量,不可以修改该指针指向内容的值。
4.通过双引号“”定义的变量后面自动加上'\0'
5.函数指针 :跟函数定义头一样,区别是将函数名字改为(*p),如int sum(int,int)变为int (*p)(int,int)即可。
6.atoi:将数字字符串转化为整型
7.存放内存位置从低到高:
正文段(text):代码段
数据段(data):有两种,初始化数据段(初始化的全局变量和static变量);未初始化数据段(BSS:未初始化的全局变量和static变量)
栈:局部变量
堆:动态分配的内存
8.动态分配的指针变量本身保存在数据段或者栈中,而它指向的空间才保存在栈中。
9.static声明的静态变量,只初始化一次
10.extern可以引用外部文件的数据段中的数据,只需要在linux用gcc编译的时候,同时编译。而用static修饰的全局变量不可以被外部文件引用。引用格式:extern 类型 变量名。
11.typedef:重命名
12.函数返回值不可以是一个地址,因为局部变量地址只在函数调用的时候有用。
13.exit(0):要加头文件#include<stdlib.h>
14.union共用体
15.enum枚举
16.fopen:打开文件,模式有r、w、a、r+、w+、a+。例如fopen(fp,"r")
17.char fgetc(FILE *fp):从fp中获得一个字符
char fputc(char c,FILE *fp):将ch字符写入fp中
18.ch=fgetc(stdin):从标准输入流中获得一个字符,即与scanf("%c",&ch);
fputc(ch,stdout):将ch字符输出到显示屏上。即等价于printf("%c",ch);
19.ch=fgetc(fp):当文件读到错误或者文件尾时,返回一个EOF,即通过ch==EOF来进行判断
20.fclose(fp):关闭文件
21.stdin:标准输入流;stdout:标准输出流;stderr:标准错误流
22.#ifdef *** #endif:如果定义了
#ifndef *** #endif:如果没有定义
#define:定义
#undef:取消定义
#if....#endif:条件预编译
23.已经定义的宏:
__FILE__:当前文件名
__LINE__:当前语句所在的行
__DATE__:文件被编译的日期
__TIME__:文件被编译的时间
__STDC__:编译器是否遵循ASCII
24.fseek(fp,0,SEEK_SET):重新定位到文件开始
25.头文件有两种:<>和“”。
<> :在系统默认的目录里寻找
"" :在当前目录,如果找不到再到系统默认的目录里寻找
26.以下内存放置在.h文件中:
①:宏定义:用#define
②:结构,联合和枚举声明:struct、union、enum
③:typedef声明:重命名,增加一个别名
④:外部函数声明:extern
⑤:全局变量声明
27.格式化写到文件中:int fprintf( FILE *fp,char *format,…);
fprintf(stdout, char *format,…)
28.格式化从文件中读取数据到变量中:int fscanf(FILE *fp,char *format,…)
fscanf(stdin,char *format,…)
29.二进制文件/文本文件都可以读写,fread、fwrite:
size_t fread(
void *ptr, //存放的地址
size_t size, //元素的大小
size_t nmemb, //元素的个数
FILE *stream) //文件指针
返回值: >0 代表读到多少个元素 ;=0 表示没读到
size_t fwrite(
const void *ptr, //读取的地址
size_t size,
size_t nmemb,
FILE *stream)
返回值:成功为nmemb,错误小于nmemb
30.文件读写指针(光标):
int fseek(FILE *stream, long offset, int whence);
FILE *stream: 文件指针
long offset : 偏移量相对于 whence
int whence: SEEK_SET 文件头;SEEK_CUR 当前位置;SEEK_END 文件尾
31.void rewind(FILE *stream); ======> 等价于 : fseek(fp, 0,SEEK_SET);
32.long ftell(FILE *stream); ======> 返回 文件位置指针的当前位置
33.获得文件的大小:
fseek(fp,0,SEEK_END);size=ftell(fp);
34.int feof(FILE *stream): 判断stream文件流是否结束
如果返回 1 ,测试文件结束了(第二次测试才正确)
如果返回 0: 文件未结束
35.缓存区的大小: 1024
1.可以通过 \n 清理缓存区:
2.当缓存区满了,缓存区的内容也会输出
36.
1. 预处理 :gcc -E color.c -o color.i
2. 编译: gcc -S color.i -o color.s,把.i 变成 汇编语言
3. 汇编 gcc -c color.s -o color.o
4. 链接: gcc a.o b.o c.o -lmax -o target
37.int strlen(char *str);
char *strcat(char *dest, const char *src);
char *strncat(char *dest, const char *src, size_t n);
int strcmp(const char *s1, const char *s2);
int strncmp(const char *s1, const char *s2, size_t n);
char *strtok(char *str, const char *delim);
38.perror("");根据errno的值输出对应的错误信息
39.fflush(fp):刷新文件,把io缓冲区内容写入文件
40.setbuf(FILE* fp,char *buf):将fp的缓冲区设置为buf
41.sleep(10):休息10s
42.setbuf(stdout,buf):设置stdout的缓冲区为buf
43.setbuf(stdout,NULL):设置stdout没有缓冲区,即不需要文件结束就会输出
44.strchr:查找字符串中第一个出现的指定字符
strrchr:查找字符串中最后出现的指定字符