本筆記內(nèi)容已上傳到個(gè)人博客網(wǎng)站,推薦網(wǎng)站上觀看。
字符串處理函數(shù) | 洛希的智慧之殿堂 (luoxi.work)
“I LOVE YOU”,“洛?!?/p>②字符數(shù)組
int main
{
//初始化字符數(shù)組的每個(gè)元素
char str1[10] = {'L','O','V','E','\0'};
//可以不寫元素的個(gè)數(shù),因?yàn)榫幾g器會(huì)自動(dòng)計(jì)算
char str2[] = {'L','O','V','E','\0'};
//使用字符串常量初始化字符數(shù)組
char str3[] = {"LOVE"};
//使用字符串常量初始化,可以省略大括號(hào)
char str4[] ="LOVE";
2.字符串處理函數(shù)
①獲取字符串的長(zhǎng)度:strlen
為了區(qū)分strlen和sizeof的區(qū)別,下面用一串代碼來進(jìn)行演示下他們最后所得到的長(zhǎng)度
#include#include//引用此頭文件才能使用字符串函數(shù),當(dāng)然像vs2019就可以不用,不過最好寫上。
int main ()
{char str[] = "LOVE";
printf("%d\n",strlen(str));
printf("%d\n",sizeof(str));
return 0 ;
}
下面分別為用sizeof計(jì)算以及用strlen計(jì)算得到的結(jié)果
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-fKmma6qe-1669878738354)(https://luoxi2334.oss-cn-shanghai.aliyuncs.com/luoxi-picture/image-20221201133823416.png)]
可以看到seziof比strlen多計(jì)算出來了一個(gè),那就是我們常見的空字符’\0’
②拷貝字符串的strcpy
和strncpy
對(duì)于以上兩個(gè)拷貝字符串的函數(shù),它們到底有什么區(qū)別了,以下用一串代碼來進(jìn)行演示下它們的區(qū)別。
(1)strcpy#include#includeint main ()
{char str1[]="LOVE";
char str2[]="LOVE YOU";
char str3[114514];
strcpy(str2,str1);//將str1的字符串拷貝到str2中
strcpy(str3,"I LOVE YOU");//將"T LOVE YOU"這個(gè)字符串拷貝到str3中
printf("str1=%s\n",str1);
printf("str2=%s\n",str2);
printf("str3=%s\n",str3);
return 0 ;
}
最后打印出來的結(jié)果為
但是,如果我們將str2的字符串拷貝到str1中將會(huì)發(fā)生什么呢?
因?yàn)閟tr1只儲(chǔ)存了LOVE以及\0這五個(gè)字符,但是str2存了一共9個(gè)字符,很明顯把str2的拷貝到str1中會(huì)出現(xiàn)錯(cuò)誤,我們來看下這個(gè)錯(cuò)誤的結(jié)果會(huì)帶來什么吧!
#include#includeint main ()
{char str1[]="LOVE";
char str2[]="LOVE YOU";
char str3[114514];
strcpy(str1,str2);//將str2的字符串拷貝到str1中
strcpy(str3,"I LOVE YOU");//將"T LOVE YOU"這個(gè)字符串拷貝到str3中
printf("str1=%s\n",str1);
printf("str2=%s\n",str2);
printf("str3=%s\n",str3);
return 0 ;
}
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-90cIhX8t-1669878738355)(https://luoxi2334.oss-cn-shanghai.aliyuncs.com/luoxi-picture/image-20221201140516834.png)]
但是并沒有造成什么影響,這是為什么呢?實(shí)際上如果以上代碼出現(xiàn)這種錯(cuò)誤都是會(huì)覆蓋掉一些字符的,但是本人用的是VSCODE的編譯器,所以沒有什么影響。
(2)strncpystrncpy對(duì)比strcpy的區(qū)別就是多了一個(gè)n!當(dāng)然這是開玩笑的,實(shí)際上,多的這一個(gè)n就使得它擁有了限制字符拷貝的功能。
我們通過以下代碼來進(jìn)行理解吧。
#include#includeint main ()
{char str1[]="LOVE";
char str2[]="LOVE YOU";
char str3[114514];
strncpy(str1,str2,6);//將str2的字符串拷貝到str1中,并且限制數(shù)量為6
strcpy(str3,"I LOVE YOU");//將"T LOVE YOU"這個(gè)字符串拷貝到str3中
printf("str1=%s\n",str1);
printf("str2=%s\n",str2);
printf("str3=%s\n",str3);
return 0 ;
}
對(duì)于以上的代碼將會(huì)有怎樣的輸出結(jié)果呢?
這樣我們就實(shí)現(xiàn)了限制拷貝的數(shù)量,但是我們發(fā)現(xiàn)以上打印結(jié)果有個(gè)很大的問題,就是love y后面出現(xiàn)了亂碼?這又是為什么呢?這也是我們經(jīng)常犯的一個(gè)致命的錯(cuò)誤,就是把空字符
又忘記了!這個(gè)在我往期的筆記也有提到過,空字符的重要程度,請(qǐng)參考我的往期文章字符和字符串 | 洛希的智慧之殿堂 (luoxi.work)。
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-SDMTwHTi-1669878738355)(https://luoxi2334.oss-cn-shanghai.aliyuncs.com/luoxi-picture/image-20221201141557022.png)]
對(duì)于以上出現(xiàn)的問題,我們就必須要使得str1的第七個(gè)字符用’\0’使其進(jìn)行終止,修改后的代碼如下。
#include#includeint main ()
{char str1[]="LOVE";
str1[6]='\0';//使其拷貝到第7個(gè)字符進(jìn)行終止
char str2[]="LOVE YOU";
char str3[114514];
strncpy(str1,str2,6);//將str2的字符串拷貝到str1中,并且限制數(shù)量為6
strcpy(str3,"I LOVE YOU");//將"T LOVE YOU"這個(gè)字符串拷貝到str3中
printf("str1=%s\n",str1);
printf("str2=%s\n",str2);
printf("str3=%s\n",str3);
return 0 ;
}
最后得到的結(jié)果才是我們?nèi)缫獾慕Y(jié)果
strcat
和strncat
對(duì)于連接字符串的strcat以及strncat的功能很明顯就跟連接有很大的關(guān)系。而我們看這兩個(gè)函數(shù)是不是也是第二個(gè)函數(shù)比第一個(gè)函數(shù)多了一個(gè)n?讓我們來看看這兩個(gè)函數(shù)的相關(guān)功能的演示代碼吧!
(1)strcat#include#includeint main ()
{char str1[] = "I LOVE ";
char str2[] = "YOU";
strcat(str1,str2);//將str2的字符串拼接到str1字符串的后面
printf("str1:%s\n",str1);
return 0 ;
}
對(duì)于以上代碼的打印結(jié)果如下
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-CVYqFI77-1669878738356)(https://luoxi2334.oss-cn-shanghai.aliyuncs.com/luoxi-picture/image-20221201142714923.png)]
(2)strncat對(duì)于這個(gè)函數(shù),很明顯也是起到了一共限制的作用,但是唯一有個(gè)不同的是,它會(huì)自動(dòng)追加空字符
將其結(jié)束!所以我們就可以"偷下懶"不用寫’\0’了,我們用一串代碼來進(jìn)行演示一下吧!
#include#includeint main ()
{char str1[] = "I LOVE ";
char str2[] = "YOU";
strncat(str1,str2,1);//將str2的字符串拼接到str1字符串的后面,限制字符為1
printf("str1:%s\n",str1);
return 0 ;
}
以下為輸出結(jié)果
對(duì)于這兩個(gè)函數(shù)的功能,和明顯就是比較字符串啦!但是,它比較的究竟是什么呢?是字符串的長(zhǎng)度嗎?還是什么…如果是比較字符串的長(zhǎng)度那第二個(gè)函數(shù)的限制字符串的長(zhǎng)度是不是有點(diǎn)矛盾了,所以這里來講它們不是用來比較字符串的長(zhǎng)度的,而是通過比較ASCII碼值來比較兩個(gè)字符串是否一致
。所以它們常在if語句內(nèi)進(jìn)行判斷。
對(duì)于以上的內(nèi)容,我將用以下的代碼來進(jìn)行演示它們的功能。
(1)strcmp#include#includeint main()
{char str1[] = "I LOVE";
char str2[] = "I LOVE";
if (strcmp(str1, str2))
{printf("兩個(gè)字符串一致");
}
else
{printf("兩個(gè)字符串不一致");
}
return 0;
}
對(duì)于以上代碼,我們可以指定str1和str2的字符串是一致的,最后的結(jié)果是否會(huì)如意呢?我們來看打印結(jié)果
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-dc4FG5eD-1669878738356)(https://luoxi2334.oss-cn-shanghai.aliyuncs.com/luoxi-picture/image-20221201144523932.png)]
很奇怪,為什么會(huì)出現(xiàn)這個(gè)結(jié)果呢?它們不都是一致的嗎?為什么會(huì)判斷出來它們不一致,這是因?yàn)槲覀?code>忽略了這個(gè)函數(shù)最后返回的值的多少。
而strcmp如何計(jì)算獲得返回值呢?
我們用一串代碼來計(jì)算下它們的返回值吧!
#include#includeint main(void)
{char a[] = "LOVe";
char b[] = "LOVE";
char c[] = "love";
char d[] = "LOVe";
//strcmp()只能比較字符串, 其他形式的參數(shù)不能比較
printf("strcmp(a, b):%d\n", strcmp(a, b));//字符串之間的比較b和a進(jìn)行比較,對(duì)應(yīng)上面s1和s2比較
printf("strcmp(a, c):%d\n", strcmp(a, c));
printf("strcmp(a, d):%d\n", strcmp(a, d));
return 0;
}
打印結(jié)果如下
所以對(duì)于我們上面一開始寫的代碼,if語句里面因?yàn)樗鼈z一致返回值為0,導(dǎo)致判斷為假,所以我們只需要加個(gè) !就可以實(shí)現(xiàn)判斷了。
修改的代碼如下
#include#includeint main()
{char str1[] = "I LOVE";
char str2[] = "I LOVE";
if (!strcmp(str1, str2))
{printf("兩個(gè)字符串一致");
}
else
{printf("兩個(gè)字符串不一致");
}
return 0;
}
此時(shí)對(duì)應(yīng)的輸出結(jié)果才符合預(yù)期,以下為輸出結(jié)果。
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-NIQjhfiD-1669878738356)(https://luoxi2334.oss-cn-shanghai.aliyuncs.com/luoxi-picture/image-20221201145452913.png)]
(2)strncmp對(duì)于這個(gè)函數(shù),很明顯是起到了限制比較字符個(gè)數(shù)的作用,我們用以下的代碼來幫助理解吧!
#include#includeint main()
{char str1[] = "I LOVE dasdjasdkasd";
char str2[] = "I LOVE asdsaodiasd";
if (!strncmp(str1, str2,7))//限制比較前7個(gè)字符
{printf("兩個(gè)字符串一致");
}
else
{printf("兩個(gè)字符串不一致");
}
return 0;
}
以下為打印的結(jié)果
相反的,如果我們限制前10個(gè)字符呢?
#include#includeint main()
{char str1[] = "I LOVE dasdjasdkasd";
char str2[] = "I LOVE asdsaodiasd";
if (!strncmp(str1, str2,10))//限制比較前10個(gè)字符
{printf("兩個(gè)字符串一致");
}
else
{printf("兩個(gè)字符串不一致");
}
return 0;
}
打印結(jié)果如下
相反的,如果我們限制前10個(gè)字符呢?
#include#includeint main()
{char str1[] = "I LOVE dasdjasdkasd";
char str2[] = "I LOVE asdsaodiasd";
if (!strncmp(str1, str2,10))//限制比較前10個(gè)字符
{printf("兩個(gè)字符串一致");
}
else
{printf("兩個(gè)字符串不一致");
}
return 0;
}
打印結(jié)果如下
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
本文標(biāo)題:字符串處理函數(shù)-創(chuàng)新互聯(lián)
分享URL:http://chinadenli.net/article46/cdpohg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、網(wǎng)站維護(hù)、動(dòng)態(tài)網(wǎng)站、網(wǎng)站營(yíng)銷、網(wǎng)站內(nèi)鏈、手機(jī)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)