实践过程中的一些c函数/指令及含义的积累。
函数积累
函数/指令 | 含义 | 补充说明 | 对应函数头文件 |
---|---|---|---|
int main(intargc,charargv[],charenvp[]); | 对于其参数说明见图1 | envp:存放系统的环境变量,保存用户环境中的变量字符串,以NULL结束,envp一旦传入,它就只是单纯的字符串数组而已,不会随着程序动态设置发生改变。可以使用putenv函数实时修改环境变量,也能使用getenv实时查看环境变量,但是envp本身不会发生改变 | #include <stdio.h> |
scanf(“格式控制字符串”, 地址表列); | 其中,格式控制字符串的作用与printf函数相同,但不能显示非格式字符串,也就是不能显示提示字符串。地址表列中给出各变量的地址。地址是由地址运算符“&”后跟变量名组成的 | &a、&b分别表示变量a和变量b的地址 | #include <stdio.h> |
char strstr( char str, char * substr ); | 用来检索子串在字符串中首次出现的位置,str为要检索的字符串,substr为要检索的子串 | 返回字符串str中第一次出现子串substr的地址;如果没有检索到子串,则返回NULL | #include <string.h> |
void memcpy(void dest, const void *src, size_t n); | memcpy() 会复制 src 所指的内存内容的前 num 个字节到 dest 所指的内存地址上 | 如图2 | #include <string.h> |
char gets(char string) | gets()函数从流中读取字符串,直到出现换行符或读到文件尾为止,最后加上NULL作为字符串结束; 所读取的字符串暂存在给定的参数string中,若成功则返回string的指针,否则返回NULL | 由于gets()不检查字符串string的大小,必须遇到换行符或文件结尾才会结束输入,因此容易造成缓存溢出的安全性问题,导致程序崩溃,可以使用fgets()代替 | #include <stdio.h> |
ssize_t read(int fd, void * buf, size_t count); | read()会把参数fd 所指的文件传送count 个字节到buf 指针所指的内存中 | 若参数count 为0, 则read()不会有作用并返回0. 返回值为实际读取到的字节数, 如果返回0, 表示已到达文件尾或是无可读取的数据,此外文件读写位置会随读取到的字节移动,更多说明见图3 | #include <unistd.h> |
char strcpy(char dest, const char *src); | strcpy()会将参数src 字符串拷贝至参数dest 所指的地址,然后返回参数dest 的字符串起始地址 | 由于该函数没有检查数据长度,如果参数 dest 所指的内存空间不够大,可能会造成缓冲溢出,在编写程序时请特别留意,或者用strncpy()来取代 | #include <string.h> |
void free (void* ptr); | ptr 为将要释放的内存空间的地址,free() 可以释放由 malloc() 、calloc() 、realloc() 分配的内存空间,free() 只能释放动态分配的内存空间,如果 ptr 所指向的内存空间不是由上面的三个函数所分配的,或者已被释放,那么调用 free() 会有无法预知的情况发生,如果 ptr 为 NULL ,那么 free() 不会有任何作用 |
free() 不会改变 ptr 变量本身的值,调用 free() 后它仍然会指向相同的内存空间,但是此时该内存已无效,不能被使用。所以建议将 ptr 的值设置为 NULL |
#include <stdlib.h> |
int strcmp(const char s1, const char s2); | 见图4 | 见图4 | #include <string.h> |
long int strtol (const char* str, char** endptr, int base); | 将字符串转换为长整型数(long) | 见图5 | #include <stdlib.h> |
int strncmp ( const char str1, const char str2, size_t n ); | 用来比较两个字符串的前n个字符,区分大小写,str1, str2 为需要比较的两个字符串,n为要比较的字符的数目 | 见图6 | #include <string.h> |
int atoi (const char * str); | 将字符串转换成整数(int) | 见图7 | #include <stdlib.h> |
char strset( char s, char c); | 将字符串中的所有字符都设置为一个指定字符,s为要设置的字符串,c为指定字符;返回设置后的字符串指针,即 s | strset() 不会生成新字符串,而是修改原有字符串,因此它只能操作字符数组,不能操作字符串指针指向的字符串,因为字符串指针指向字符串常量,常量不能被修改。如果你希望指定要设置的字符的个数,可以使用strnset()。 | #include<string.h> |
void memset( void ptr, int value, size_t num ); | 用来将指定内存的前n个字节设置为特定的值, 返回指向 ptr 的指针。ptr 为要操作的内存的指针。value 为要设置的值。你既可以向 value 传递 int 类型的值,也可以传递 char 类型的值,int 和 char 可以根据 ASCII 码相互转换。num 为 ptr 的前 num 个字节,size_t 就是unsigned int。 | memset() 可以将一段内存空间全部设置为特定的值,所以经常用来初始化字符数组;参数 value 虽声明为 int,但必须是 unsigned char,所以范围在0 到255 之间。 | #include <string.h> |
clock_t clock(void); | 返回处理器调用某个进程或函数所花费的时间,clock_t其实就是long,即长整形。该函数返回值是硬件滴答数,要换算成秒或者毫秒,需要除以CLK_TCK或者CLOCKS_PER_SEC。比如,在VC++6.0下,这两个量的值都是1000,这表示硬件滴答1000下是1秒,因此要计算一个进程的时间,用clock()除以1000即可。 | C语言中求程序执行的时间可以使用clock()函数,函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数。 | #include <time.h> |
FILE fopen(const char path, const char * mode); | 用来以指定的方式打开文件,path为包含了路径的文件名,mode为文件打开方式。文件顺利打开后,指向该流的文件指针就会被返回。若果文件打开失败则返回NULL。更多说明详见图8. | 文件操作完成后,需要将文件关闭,一定要注意,否则会造成文件所占用内存泄露和在下次访问文件时出现问题。文件关闭后,需要将文件指针指向空,这样做会防止出现游离指针,而对整个工程造成不必要的麻烦,如fp = NULL。 | #include <stdio.h> |
char fgets(char string, int size, FILE * stream); | 用于从文件流中读取一行或指定个数的字符。 | 更多说明见图9。 | include<stdio.h> |
char strcat(char dest, const char *src); | 用来连接字符串,dest 为目的字符串指针,src 为源字符串指针,返回dest 字符串起始地址。 | strcat() 会将参数 src 字符串复制到参数 dest 所指的字符串尾部;dest 最后的结束字符 NULL 会被覆盖掉,并在连接后的字符串的尾部再增加一个 NULL。 dest 与 src 所指的内存空间不能重叠,且 dest 要有足够的空间来容纳要复制的字符串。 | #include <string.h> |
int isalpha(int c); | 用来判断一个字符是否是英文字母,相当于 isupper(c)/islower(c)。 | c 为需要被检测的字符,若参数c 为英文字母(a ~ z A ~ Z),则返回非 0 值,否则返回 0 | #include <ctype.h> |
int getche(void); | 该函数没有参数,从控制台读取字符,并在控制台显示读取的字符ASCII码值。 | #include<stdio.h> #include<conio.h> | |
double pow(double x, double y); | 用来计算以x 为底的 y 次方值,然后将结果返回。 | 见图10 | #include <math.h> |
补充
图1——
图2——
图3——
图4——
图5——
strtol(), strtoll(), strtoul(), strtoull()函数参数如下图;
第一个参数 nptr是要转化的字符串;
第三个参数base说明nptr的进制,base 的取值范围为 0,2-36;
http://zengwu3915.blog.163.com/blog/static/27834897201262562912597/