本筆記內容已上傳到個人博客網站,推薦網站上觀看。
字符串處理函數 | 洛希的智慧之殿堂 (luoxi.work)
“I LOVE YOU”,“洛希”
②字符數組int main
{
//初始化字符數組的每個元素
char str1[10] = {'L','O','V','E','\0'};
//可以不寫元素的個數,因為編譯器會自動計算
char str2[] = {'L','O','V','E','\0'};
//使用字符串常量初始化字符數組
char str3[] = {"LOVE"};
//使用字符串常量初始化,可以省略大括號
char str4[] ="LOVE";2.字符串處理函數
①獲取字符串的長度:strlen為了區分strlen和sizeof的區別,下面用一串代碼來進行演示下他們最后所得到的長度
#include#include//引用此頭文件才能使用字符串函數,當然像vs2019就可以不用,不過最好寫上。
int main ()
{char str[] = "LOVE";
printf("%d\n",strlen(str));
printf("%d\n",sizeof(str));
return 0 ;
} 下面分別為用sizeof計算以及用strlen計算得到的結果
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-fKmma6qe-1669878738354)(https://luoxi2334.oss-cn-shanghai.aliyuncs.com/luoxi-picture/image-20221201133823416.png)]
可以看到seziof比strlen多計算出來了一個,那就是我們常見的空字符’\0’
②拷貝字符串的strcpy和strncpy對于以上兩個拷貝字符串的函數,它們到底有什么區別了,以下用一串代碼來進行演示下它們的區別。
(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"這個字符串拷貝到str3中
printf("str1=%s\n",str1);
printf("str2=%s\n",str2);
printf("str3=%s\n",str3);
return 0 ;
} 最后打印出來的結果為

但是,如果我們將str2的字符串拷貝到str1中將會發生什么呢?
因為str1只儲存了LOVE以及\0這五個字符,但是str2存了一共9個字符,很明顯把str2的拷貝到str1中會出現錯誤,我們來看下這個錯誤的結果會帶來什么吧!
#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"這個字符串拷貝到str3中
printf("str1=%s\n",str1);
printf("str2=%s\n",str2);
printf("str3=%s\n",str3);
return 0 ;
} [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-90cIhX8t-1669878738355)(https://luoxi2334.oss-cn-shanghai.aliyuncs.com/luoxi-picture/image-20221201140516834.png)]
但是并沒有造成什么影響,這是為什么呢?實際上如果以上代碼出現這種錯誤都是會覆蓋掉一些字符的,但是本人用的是VSCODE的編譯器,所以沒有什么影響。
(2)strncpystrncpy對比strcpy的區別就是多了一個n!當然這是開玩笑的,實際上,多的這一個n就使得它擁有了限制字符拷貝的功能。
我們通過以下代碼來進行理解吧。
#include#includeint main ()
{char str1[]="LOVE";
char str2[]="LOVE YOU";
char str3[114514];
strncpy(str1,str2,6);//將str2的字符串拷貝到str1中,并且限制數量為6
strcpy(str3,"I LOVE YOU");//將"T LOVE YOU"這個字符串拷貝到str3中
printf("str1=%s\n",str1);
printf("str2=%s\n",str2);
printf("str3=%s\n",str3);
return 0 ;
} 對于以上的代碼將會有怎樣的輸出結果呢?

這樣我們就實現了限制拷貝的數量,但是我們發現以上打印結果有個很大的問題,就是love y后面出現了亂碼?這又是為什么呢?這也是我們經常犯的一個致命的錯誤,就是把空字符又忘記了!這個在我往期的筆記也有提到過,空字符的重要程度,請參考我的往期文章字符和字符串 | 洛希的智慧之殿堂 (luoxi.work)。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-SDMTwHTi-1669878738355)(https://luoxi2334.oss-cn-shanghai.aliyuncs.com/luoxi-picture/image-20221201141557022.png)]
對于以上出現的問題,我們就必須要使得str1的第七個字符用’\0’使其進行終止,修改后的代碼如下。
#include#includeint main ()
{char str1[]="LOVE";
str1[6]='\0';//使其拷貝到第7個字符進行終止
char str2[]="LOVE YOU";
char str3[114514];
strncpy(str1,str2,6);//將str2的字符串拷貝到str1中,并且限制數量為6
strcpy(str3,"I LOVE YOU");//將"T LOVE YOU"這個字符串拷貝到str3中
printf("str1=%s\n",str1);
printf("str2=%s\n",str2);
printf("str3=%s\n",str3);
return 0 ;
} 最后得到的結果才是我們如意的結果

strcat和strncat對于連接字符串的strcat以及strncat的功能很明顯就跟連接有很大的關系。而我們看這兩個函數是不是也是第二個函數比第一個函數多了一個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 ;
} 對于以上代碼的打印結果如下
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-CVYqFI77-1669878738356)(https://luoxi2334.oss-cn-shanghai.aliyuncs.com/luoxi-picture/image-20221201142714923.png)]
(2)strncat對于這個函數,很明顯也是起到了一共限制的作用,但是唯一有個不同的是,它會自動追加空字符將其結束!所以我們就可以"偷下懶"不用寫’\0’了,我們用一串代碼來進行演示一下吧!
#include#includeint main ()
{char str1[] = "I LOVE ";
char str2[] = "YOU";
strncat(str1,str2,1);//將str2的字符串拼接到str1字符串的后面,限制字符為1
printf("str1:%s\n",str1);
return 0 ;
} 以下為輸出結果

對于這兩個函數的功能,和明顯就是比較字符串啦!但是,它比較的究竟是什么呢?是字符串的長度嗎?還是什么…如果是比較字符串的長度那第二個函數的限制字符串的長度是不是有點矛盾了,所以這里來講它們不是用來比較字符串的長度的,而是通過比較ASCII碼值來比較兩個字符串是否一致。所以它們常在if語句內進行判斷。
對于以上的內容,我將用以下的代碼來進行演示它們的功能。
(1)strcmp#include#includeint main()
{char str1[] = "I LOVE";
char str2[] = "I LOVE";
if (strcmp(str1, str2))
{printf("兩個字符串一致");
}
else
{printf("兩個字符串不一致");
}
return 0;
} 對于以上代碼,我們可以指定str1和str2的字符串是一致的,最后的結果是否會如意呢?我們來看打印結果
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-dc4FG5eD-1669878738356)(https://luoxi2334.oss-cn-shanghai.aliyuncs.com/luoxi-picture/image-20221201144523932.png)]
很奇怪,為什么會出現這個結果呢?它們不都是一致的嗎?為什么會判斷出來它們不一致,這是因為我們忽略了這個函數最后返回的值的多少。
而strcmp如何計算獲得返回值呢?
我們用一串代碼來計算下它們的返回值吧!
#include#includeint main(void)
{char a[] = "LOVe";
char b[] = "LOVE";
char c[] = "love";
char d[] = "LOVe";
//strcmp()只能比較字符串, 其他形式的參數不能比較
printf("strcmp(a, b):%d\n", strcmp(a, b));//字符串之間的比較b和a進行比較,對應上面s1和s2比較
printf("strcmp(a, c):%d\n", strcmp(a, c));
printf("strcmp(a, d):%d\n", strcmp(a, d));
return 0;
} 打印結果如下

所以對于我們上面一開始寫的代碼,if語句里面因為它倆一致返回值為0,導致判斷為假,所以我們只需要加個 !就可以實現判斷了。
修改的代碼如下
#include#includeint main()
{char str1[] = "I LOVE";
char str2[] = "I LOVE";
if (!strcmp(str1, str2))
{printf("兩個字符串一致");
}
else
{printf("兩個字符串不一致");
}
return 0;
} 此時對應的輸出結果才符合預期,以下為輸出結果。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-NIQjhfiD-1669878738356)(https://luoxi2334.oss-cn-shanghai.aliyuncs.com/luoxi-picture/image-20221201145452913.png)]
(2)strncmp對于這個函數,很明顯是起到了限制比較字符個數的作用,我們用以下的代碼來幫助理解吧!
#include#includeint main()
{char str1[] = "I LOVE dasdjasdkasd";
char str2[] = "I LOVE asdsaodiasd";
if (!strncmp(str1, str2,7))//限制比較前7個字符
{printf("兩個字符串一致");
}
else
{printf("兩個字符串不一致");
}
return 0;
} 以下為打印的結果

相反的,如果我們限制前10個字符呢?
#include#includeint main()
{char str1[] = "I LOVE dasdjasdkasd";
char str2[] = "I LOVE asdsaodiasd";
if (!strncmp(str1, str2,10))//限制比較前10個字符
{printf("兩個字符串一致");
}
else
{printf("兩個字符串不一致");
}
return 0;
} 打印結果如下
相反的,如果我們限制前10個字符呢?
#include#includeint main()
{char str1[] = "I LOVE dasdjasdkasd";
char str2[] = "I LOVE asdsaodiasd";
if (!strncmp(str1, str2,10))//限制比較前10個字符
{printf("兩個字符串一致");
}
else
{printf("兩個字符串不一致");
}
return 0;
} 打印結果如下
你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧
本文標題:字符串處理函數-創新互聯
分享URL:http://www.yijiale78.com/article46/cdpohg.html
成都網站建設公司_創新互聯,為您提供網站設計公司、網站維護、動態網站、網站營銷、網站內鏈、手機網站建設
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯