博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言中字符串的理解和常用的字符串操作
阅读量:6997 次
发布时间:2019-06-27

本文共 4042 字,大约阅读时间需要 13 分钟。

hot3.png

        每种语言中对字符串的操作要求都比较高,掌握字符串的操作,可以帮助我们对字符串进行更好的封装和拆分,完成信息的传递(发送和接受)

1、字符串的本质

    字符串在内存中的存储方式(一个字符对应一个字节,内存中存贮的字符的ASSIC码值)

    190311_VpTx_1783725.png

    整数在内存中的存储本质(将1234的字符转化为其对象的ASCII值存贮在内存中)

        190643_CYF8_1783725.png

    字符串的读取规则(遇到结束符就结束,不管后面还有没有字符,如果都没有结束符,就会使程序卡死在那里。)

    191211_XBMj_1783725.png

    整数的读取显示和内存中的存储(与大小字节序有关)

        详细请看    

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的子串。如果是,则该函数返回str2str1中首次出现的地址;否则,返回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

 

 

转载于:https://my.oschina.net/u/1783725/blog/639528

你可能感兴趣的文章