每种语言中对字符串的操作要求都比较高,掌握字符串的操作,可以帮助我们对字符串进行更好的封装和拆分,完成信息的传递(发送和接受)
1、字符串的本质
字符串在内存中的存储方式(一个字符对应一个字节,内存中存贮的字符的ASSIC码值)
整数在内存中的存储本质(将1234的字符转化为其对象的ASCII值存贮在内存中)
字符串的读取规则(遇到结束符就结束,不管后面还有没有字符,如果都没有结束符,就会使程序卡死在那里。)
整数的读取显示和内存中的存储(与大小字节序有关)
详细请看
2、字符串结束符 (很重要)
'0',NULL,0 这三个都是字符串的结束符,在内存中占用一个字节,内存值为 0x00
printf(" \'0\'=%d \'\\0\'=%d NULL=%d 0=%d\n",'0','\0',NULL,0); //打印出整型值(十进制)printf(" \'0\'=%#x \'\\0\'=%#x NULL=%#x 0=%#x \n",'0','\0',NULL,0); //打印出整型值(十六进制)
输出:
'0'=48 '\0'=0 NULL=0 0=0 //可以看出字符串结束符的整型值都是0 '0'=0x30 '\0'=0 NULL=0 0=0 //可以看出字符串结束符的整型值都是0
意义:就是在读取字符串时,遇到它(字符串结束符),就算读到字符串的结尾了,不在管后面还有没有字符串了。
3、字符串的截取strstr(str1,str2)和strtok(str1,str2)
strstr(str1,str2) 函数,获取指定字符串首次出现的位置。
用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。
包含文件:
原型:char
*strstr(char
*str1, const
char
*str2);
参数说明
str1: 被查找目标
str2:要查找对象
该函数返回str2第一次在str1中的位置,如果没有找到,返回NULL
实例:
#include#include int main(void){ char srcString[] = "myFamily = myMothet + myFather"; //源字符串 char splitString[] = "my"; //需要判断位置的字符串 char *result = NULL; printf("source string is \"%s\" \n",srcString); result = strstr(srcString,splitString); //依次打印出所有"abc"出现的位置及其后的字符串 while(result != NULL) { printf("result is index:%d \"%s\"\n",(int)(result-srcString),result); result = strstr(result+strlen("abc"),splitString); } return 0;}
输出结果:
source string is "myFamily = myMothet + myFather"result is index:0 "myFamily = myMothet + myFather"result is index:11 "myMothet + myFather"result is index:22 "myFather"
strtok(str1,str2) 函数,根据str2的分隔符集合,获取被分隔符分割出的子字符串的集合
获取被分隔符分割出的子字符串的集合,如果分隔标记没有找到,函数返回NULL,第一次调用str1 指向作为标记的分隔符。之后所以的调用str1 都应为NULL。
包含文件:
原型:char
*strtok(char
*str1, const
char
*str2);
参数说明
str1: 被查找目标
str2:分割符集合
该函数返回分隔符依次在str1中出现的位置,如果没有找到,返回NULL
实例:
#include#include int main(void){ char srcString[] = "Family=Father+Mother+Children"; //源字符串 char delims[]="=+"; //分隔符 char *result = NULL; printf("source string is \"%s\" \n",srcString); result = strtok(srcString, delims); while(result != NULL) { printf( "result is \"%s\" index:%d\n", result,(int)(result-srcString)); result = strtok(NULL, delims); } return 0;}
输出结果:
source string is "Family=Father+Mother+Children"result is "Family" index:0result is "Father" index:7result is "Mother" index:14result is "Children" index:21
4、strcpy()函数使用
介绍:
char *strcpy( char *to, const char *from );
功能:复制字符串 将from 中的字符复制到字符串to,包括空值结束符。返回值为指针to。
注意:
to和from都是字符指针,如果传出参数是无符号的字符指针,需要强制类型转换(char *)(在某些编译环境下需注意)
错误教训:
strcpy(teacher1.name,teacher2.name); teacher结构体中的name为unsigned char name[20] 报错 invalid conversion from `unsigned char*' to `char*
5、size_t strlen( char *str )函数
功能:函数返回字符串str 的长度( 即空值结束符之前字符数目)。
6、strcat()函数详解
介绍:char *strcat( char *dest, char *src);
功能:函数将字符串src 连接到字符串dest的末端,并返回指针dest.
本质:首先在字符串dest中寻找字符串结束符(如果没有找到,将不会做任何连接),找到后将字符串src(不包括src的结束符)插入到字符串dest最后一个字符与结束符之间。
证明:
void printBuff(char buff[],int len){ int num,numCount; numCount = len; printf("数据的内存显示:"); for(num=0; num < numCount; num++) { printf("%x ",buff[num]); } printf("\n");} int main(){ char src[20] = {0}; char str1[10] = "abcd"; char str2[6] = "efghh"; memset(src+1,1,sizeof(src)-1); /*将缓存中全部灌入1(第一个位置除外,因为编译器需要寻 找src的结束符,找不到的话,将不会进行连接操作),排除0(结束符的干扰) */ printBuff(src,sizeof(src)); strcat(src,str1); printf("str1连接后的字符串:%s\n",src); printBuff(src,sizeof(src)); strcat(src,str2); printf("str2连接后的字符串:%s\n",src); printBuff(src,sizeof(src));}
输出:
数据的内存显示:0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1str1连接后的字符串:abcd数据的内存显示:61 62 63 64 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1str2连接后的字符串:abcdefghh数据的内存显示:61 62 63 64 65 66 67 68 68 0 1 1 1 1 1 1 1 1 1 1
6、字符串与其他数据类型的相互转化
(1)字符串==>整型
atof (将字符串转换成浮点型数) atoi (将字符串转换成整型数) atol (将字符串转换成长整型数) strtod (将字符串转换成浮点数) strtol (将字符串转换成长整型数) strtoul (将字符串转换成无符号长整型数)
(2)字符串<==整型 (有两种方式,比较重要)
itoa(将整型数转换为字符串)
sprintf( char *buffer, const char *format, ... );将整型数按照指定格式转化为buffer