求字符串的长度问题
在C語法中我們可以定義一個(gè)數(shù)組當(dāng)作字符串,或者直接將指針指指向一個(gè)字符串,所以我們有時(shí)候得拿出字符串中對(duì)我們有用的東西:比如
1.現(xiàn)在有一個(gè)字符串" ? ?abcd ? ?",要求出字符串去掉空格的長度 ? ??2.打印出去掉空格之后的字符串
按照題意我們需要求出長度,并去掉空格,下面我會(huì)寫出兩個(gè)不同的代碼,看看有什么區(qū)別;
首先是第一種
1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include <string.h> 4 #include <stdlib.h> 5 #include <ctype.h> 6 7 void trimblank(char *str,int *len); 8 9 10 void main() 11 { 12 char *str = " abcd "; 13 int len = 0; 14 trimblank(str,&len); 15 printf("%d\n",len); 16 printf("%s\n",str); 17 system("pause"); 18 return; 19 } 20 void trimblank(char *str,int *len) 21 { 22 int begin = 0;//開頭的下標(biāo) 23 int end = strlen(str) - 1;//結(jié)尾的下標(biāo) 24 int LenCount = 0; 25 if(str == NULL || len == NULL)//判斷傳過來的地址是否為空 26 { 27 return ; 28 } 29 if(isspace(str[begin]) && str[begin] != '\0')//isspace()判斷是否為空字符 30 { 31 begin++; 32 } 33 34 if(isspace(str[end]) && str[end] != '\0') 35 { 36 end--; 37 } 38 39 LenCount = end - begin + 1; 40 *len = LenCount; 41 strncpy(str,str+begin,LenCount);//copy函數(shù) 42 str[LenCount] = '\0';//將結(jié)尾制成'\0' 43 44 return ; 45 46 47 }上面這段代碼我們可以發(fā)現(xiàn),長度可以被求出來,但是copy函數(shù)時(shí)會(huì)報(bào)錯(cuò),編譯器會(huì)說指針指向的空間無法被修改,那么為什么無法修改,char *str = " abcd ";通過這句代碼我們可以知道指針指向的是全局區(qū),即下圖所示:
然后我們可以看出來我們分配的是全局區(qū)的字符串常量,記住是常量,所以內(nèi)存空間無法被修改,當(dāng)我們試圖往當(dāng)中copy數(shù)據(jù)時(shí)
編譯器會(huì)報(bào)錯(cuò)。所以說為了讓其能夠被修改,我們一般都會(huì)使用可修改的內(nèi)存空間,比如在這里,我們可以使用臨時(shí)區(qū)(棧區(qū))分配的空間來儲(chǔ)存數(shù)據(jù);
代碼如下:
1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include <string.h> 4 #include <stdlib.h> 5 #include <ctype.h> 6 7 void trimblank(char *str,int *len); 8 9 void main() 10 { 11 //char *str = " abcd "; 12 char str[10] = " abcd ";//將字符串導(dǎo)入到臨時(shí)區(qū) 13 int len = 0;// 14 15 trimblank(str,&len); 16 printf("%d\n",len); 17 printf("%s\n",str); 18 system("pause"); 19 return; 20 } 21 22 void trimblank(char *str,int *len) 23 { 24 int begin = 0;//開頭的下標(biāo) 25 int end = strlen(str) - 1;//結(jié)尾的下標(biāo) 26 int LenCount = 0; 27 if(str == NULL || len == NULL)//判斷傳過來的地址是否為空 28 { 29 return ; 30 } 31 if(isspace(str[begin]) && str[begin] != '\0')//isspace()判斷是否為空字符 32 { 33 begin++; 34 } 35 36 if(isspace(str[end]) && str[end] != '\0') 37 { 38 end--; 39 } 40 41 LenCount = end - begin + 1; 42 *len = LenCount; 43 strncpy(str,str+begin,LenCount); 44 str[LenCount] = '\0'; 45 46 return ; 47 48 }
當(dāng)我們使用臨時(shí)區(qū)儲(chǔ)存數(shù)據(jù)時(shí),會(huì)把全局區(qū)的數(shù)據(jù)copy一份到臨時(shí)區(qū),而函數(shù)中的指針則指向了臨時(shí)區(qū)的地址,而臨時(shí)區(qū)的空間是可以改變的;
關(guān)于函數(shù)中的代碼,strlen是計(jì)算字符串中的到非空字符位置的個(gè)數(shù),這個(gè)非空并非指空格,空格也是字符,這個(gè)空是指'\0',字符串的終止符,即讀取字符串時(shí),一旦遇到這個(gè)符號(hào),就會(huì)停止讀取。也就是說這個(gè)位置什么數(shù)據(jù)都沒有。
str[LenCount] = '\0';這一句估計(jì)有人看的不是很懂,我來解釋一下,因?yàn)閿?shù)組的下標(biāo)都是從零開始的,LenCount是字符串的長度4,也就是說d這個(gè)字符會(huì)被寫到下標(biāo)為3的位置,我們知道'\0'是字符串的終止符所以在d后面加一個(gè)'\0'后讀取到這里的時(shí)候,就會(huì)停止讀取了,而不會(huì)再繼續(xù)讀取。
轉(zhuǎn)載于:https://www.cnblogs.com/huhaihao/p/7739956.html
總結(jié)
- 上一篇: redis3.0.0 集群环境部署
- 下一篇: go micro 学习笔记 2:环境搭建