目录
1.C中的字符串一定以空字符(为非打印字符)结束。
这意味这存储字符串的数组的容量必须至少比待存储字符串中的字符数多1。
'x'和"x"的区别在于,第一个的x的存储空间为1,第二个的x的存储空间为2(字符串末尾存在'\0')。
2.字符串的输入与输出
scanf()函数在遇到第一个空白(空格、制表符、换行符)时就不再读取输入。读取数组时不需要&,因为数组名就代表了地址。因此通过键盘输入字符数组时一般不用scanf()函数,用fgets()函数。
输入单个字符:ch=getchar();
获取单个字符:putchar(ch);
输入字符串:fgets();
获取字符串:fputs();
3.strlen()函数和sizrof运算符
strlen()函数读取可打印字符的个数,sizeof运算符读取总存储单元。sizeof和strlen()的区别是,strlen()不包含最后的空字符\0。
#include<stdio.h>
#include<string.h>
#define AA "i am AA"
int main()
{
char name[40];
printf("输入姓名:\n"); //AA BB
scanf("%s",name);
printf("%zd,%zd",strlen(name),sizeof name); //2,40
printf("%zd,%zd",strlen(AA),sizeof AA); //7,8
}
sizeof返回size_t类型的值,在C99中使用%zd打印输出。size_t 并不是一个新类型,而是通过typedef重别名了unsigned int。
4.scanf()函数
如果用scanf()读取基本变量类型的值,在变量名前加上一个&。
如果用scanf()把字符串读入字符数组中,不要使用&。
5.字符处理库ctype.h
函数名 | 描述 |
int isalnum(int c) | 测试c是否为字母或数字 |
int isalpha(int c) | 测试c是否为字母 |
int iscsym(int c) | 测试c是否为字母、下划线或数字 |
int iscsymf(int c) | 测试c是否为字母、下划线 |
int isdigit(int c) | 测试c是否为十进制数字 |
int islower(int c) | 测试c是否为小写字母 |
int isupper(int c) | 测试c是否为大写字母 |
int ispunct(int c) | 测试c是否为标点符号 |
int isspace(int c) | 测试c是否为空白 |
int toascii(int c) | 将字符c转换成ASCII码 |
int tolower(int c) | 将字符c转换成小写字母 |
int toupper(int c) | 将字符c转换成大写字母 |
6.实用函数库stdlib.h
函数名 | 描述 |
double atof(const char *nptr) | 将字符串转换成双精度浮点型数 |
int atoi(const char *nptr) | 将字符串转换成整型数 |
long atol(const char *nptr) | 将字符串转换成长整型数 |
doule strtod(const char *nptr,char **endptr) | 将字符串转换成双精度浮点型数 |
long int strtol(const char *nptr,char **endptr,int base) | 将字符串转换成长整型数 |
insigned long int strtoul(const char *nptr,char **endptr,int base) | 将字符串转换成无符号长整型数 |
char *gcvt(double number,size_t ndigits,char *buf) | 将浮点型数转换成字符串,取四舍五入 |
7.字符串处理库string.h
函数名 | 描述 |
char *strcpy(char *s1,const char *s2) | 将字符串s2复制到字符数组s1中 |
char *strncpy(char *s1,const char *s2,size_t n) | 将字符串s2开始的n个字符赋值到字符数组s1中 |
char *strcat(char *s1,const char *s2) | 将字符串s2追加到字符数组s1中的字符串后 |
char *strncat(char *s1,const char *s2,size_t n) | 将字符串s2开始的n个字节追加到字符数组s1中的字符串后 |
8.其它字符串函数
函数名 | 描述 |
char *strcmp(char *s1,const char *s2) | 比较字符串s1与字符串s2 |
char *strncmp(char *s1,const char *s2,size_t n) | 比较字符串s1与字符串s2前n个字符 |
char *strchr(const char *s,int c) | 查找c所代表的字符在字符串s中首次出现的位置,成功将返回该位置的指针,否则返回NULL |
char *strrchr(const char *s,int c) | 返回c所代表的字符在字符串s中最后一次出现的位置,成功将返回该位置的指针,否则返回NULL |
size_t strcspn(const char *s1,const char *s2) | 计算并返回字符串s1中不包含字符串s2中任何字符的起始段的长度。即在字符串s1中查找是否有字符串s2的字符,若碰到有该字符则返回从开始到该字符之前的字符串长度 |
size_t strspn(const char *s1,const char *s2) | 计算并返回字符串s1中只包含字符串s2中任何字符的起始段的长度。即当在字符串s1中没遇到在字符串s2的字符时,返回从开始到该字符之前的字符串长度 |
size_t strpbrk(const char *s1,const char *s2) | 查找字符串s2中任意字符在字符串s1中首次出现的位置。如果找到了来自字符串s2的字符,则返回指向字符串s1中那个字符的指针,否则返回NULL |
size_t strstr(const char *s1,const char *s2) | 返回字符串s2在字符串s1中首次出现(整个字符串匹配)的位置指针,否则返回NULL |
char *strtok(char *s1,const char *s2) | 对strtok()函数的反复调用将使字符串s1分解成若干“记号”(类似文本行中单词的逻辑部分),这些记号用字符串s2中所包含的字符分开。第1次调用包含s1作为第一个参数,而继续划分相同字符串的后续调用将包含NULL作为第1个参数。每次调用将返回指向当前记号的指针。如果当调用函数时没有更多的记号,则返回NULL |
void *memcpy(void *s1,const void *s2,size_t n) | 将s2指向的内存块内n个字符复制到s1指向的内存块内,返回结果对象的指针 |
void *memcpy(void *s1,const void *s2,size_t n) | 将s2指向的内存块内n个字符复制内存中的临时空间,在从临时空间复制到s1指向的内存块内,返回结果对象的指针 |
int memcmp(const void *s1,const void *s2,size_t n) | 用于比较s1和s2所指向的内存块中前n个字符的大小,返回比较结果 |
void *memchr(const void *s,int c,size_t n) | 查找s所指向的内存块的前n个字符内第1次出现c(函数中将转换为unsigned char)的地方。如果找到了c,则返回s1中c的指针。否则返回NULL |
void *memset(void *s,int c,size_t n) | 将c(函数中将转换为unsigned char)复制到s所指向的内存块的前n个字符中,返回产生的指针 |
char *strerror(int errornum) | 用和系统相关的方式将errornum映射到纯文本字符串中,返回指向该字符串的指针 |
size_t strlen(const char *s) | 确定字符串s的长度,返回字符串结束符前的字符个数 |