您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)c語(yǔ)言如何進(jìn)行字符串比較,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
C語(yǔ)言是一門(mén)面向過(guò)程的、抽象化的通用程序設(shè)計(jì)語(yǔ)言,廣泛應(yīng)用于底層開(kāi)發(fā),使用C語(yǔ)言可以以簡(jiǎn)易的方式編譯、處理低級(jí)存儲(chǔ)器。
比較方法:1、bcmp(),比較字符串的前n個(gè)字節(jié)是否相等;2、strcmp(),區(qū)分大小寫(xiě)的比較字符串;3、stricmp(),不區(qū)分大小寫(xiě)的比較字符串;4、strncmp()或strnicmp(),區(qū)分大小寫(xiě)的比較字符串的前n個(gè)字符。
本教程操作環(huán)境:windows7系統(tǒng)、c99版本、Dell G3電腦。
使用bcmp()--比較內(nèi)存(字符串)的前n個(gè)字節(jié)是否相等
原型為:
int bcmp(const void *s1, const void * s2, int n);
【參數(shù)】s1, s2 為需要比較的兩塊內(nèi)存(或兩個(gè)字符串),n 為要比較的長(zhǎng)度。
【返回值】如果 s1, s2 的前 n 個(gè)字節(jié)相等或者 n 等于 0,則返回 0,否則返回非 0 值。
bcmp() 函數(shù)不檢查NULL。
實(shí)際上,bcmp() 和 memcmp() 功能相同,用來(lái)比較內(nèi)存塊的前 n 個(gè)字節(jié)是否相等,但是 s1, s2 兩個(gè)參數(shù)為指針,又很奇怪的位于 string.h 文件中,也可以用來(lái)比較字符串。
示例:
#include <stdio.h> #include <string.h> int main () { char *s1 = "Golden Global View"; char *s2 = "Golden Global View"; if( !bcmp(s1, s2, 7) ) printf("s1 equal to s2 in first 7 bytes"); else printf("s1 not equal to s2 in first 7 bytes"); return 0; }
使用strcmp()--比較字符串(區(qū)分大小寫(xiě))
其原型為:
int strcmp(const char *s1, const char *s2);
【參數(shù)】s1, s2 為需要比較的兩個(gè)字符串。
字符串大小的比較是以ASCII 碼表上的順序來(lái)決定,此順序亦為字符的值。strcmp()首先將s1 第一個(gè)字符值減去s2 第一個(gè)字符值,若差值為0 則再繼續(xù)比較下個(gè)字符,若差值不為0 則將差值返回。例如字符串"Ac"和"ba"比較則會(huì)返回字符"A"(65)和'b'(98)的差值(-33)。
【返回值】若參數(shù)s1 和s2 字符串相同則返回0。s1 若大于s2 則返回大于0 的值。s1 若小于s2 則返回小于0 的值。
注意:strcmp() 以二進(jìn)制的方式進(jìn)行比較,不會(huì)考慮多字節(jié)或?qū)捵止?jié)字符。
示例:
#include <string.h> main(){ char *a = "aBcDeF"; char *b = "AbCdEf"; char *c = "aacdef"; char *d = "aBcDeF"; printf("strcmp(a, b) : %d\n", strcmp(a, b)); printf("strcmp(a, c) : %d\n", strcmp(a, c)); printf("strcmp(a, d) : %d\n", strcmp(a, d)); }
輸出:
strcmp(a, b) : 32 strcmp(a, c) :-31 strcmp(a, d) : 0
使用stricmp()--比較字符串(不區(qū)分大小寫(xiě))
原型為:
int strcmp(char *s1, char *s2);
【參數(shù)說(shuō)明】s1, s2 為需要比較的兩個(gè)字符串。
字符串大小的比較是以ASCII 碼表上的順序來(lái)決定,此順序亦為字符的值。stricmp()首先將s1 第一個(gè)字符值減去s2 第一個(gè)字符值,若差值為0 則再繼續(xù)比較下個(gè)字符,若差值不為0 則將差值返回。例如字符串"Ac"和"ba"比較則會(huì)返回字符"A"(65)和'b'(98)的差值(-33)。
【返回值】若參數(shù)s1 和s2 字符串相同則返回0。s1 若大于s2 則返回大于0 的值。s1 若小于s2 則返回小于0 的值。
注意:stricmp()是Windows下特有的,linux下具有相同功能的函數(shù)是strcasecmp(),包含在頭文件strings.h下。
另外一個(gè)不區(qū)分大小寫(xiě)比較字符串的函數(shù)是strcmpi(),strcmpi()是stricmp()的宏定義,實(shí)際未提供此函數(shù)。
示例:比較兩個(gè)字符串的大小。
#include<stdio.h> #include<string.h> int main(void) { /*定義兩個(gè)字符串*/ char* s1 = "http://see.xidian.edu.cn/cpp/u/biaozhunku/"; char* s2 = "http://see.xidian.edu.cn/cpp/shujujiegou/"; /*比較字符串(不分大小寫(xiě))*/ int result = stricmp(s1,s2); // 也可以改成strcmpi() if(result>0) { printf("Result: s1 > s2"); } else if(result<0) { printf("Result: s1 < s2"); } else if(result == 0) { printf("Result: s1 = s2"); } getchar();/*等待用戶輸入個(gè)字符,然后退出*/ return 0; }
輸出:
Result: s1 > s2
使用strncmp()--比較字符串的前n個(gè)字符(區(qū)分大小寫(xiě))
其原型為:
int strncmp ( const char * str1, const char * str2, size_t n );
【參數(shù)】str1, str2 為需要比較的兩個(gè)字符串,n為要比較的字符的數(shù)目。
字符串大小的比較是以ASCII 碼表上的順序來(lái)決定,此順序亦為字符的值。strncmp()首先將s1 第一個(gè)字符值減去s2 第一個(gè)字符值,若差值為0 則再繼續(xù)比較下個(gè)字符,直到字符結(jié)束標(biāo)志'\0',若差值不為0,則將差值返回。例如字符串"Ac"和"ba"比較則會(huì)返回字符"A"(65)和'b'(98)的差值(-33)。
注意:要比較的字符包括字符串結(jié)束標(biāo)志'\0',而且一旦遇到'\0'就結(jié)束比較,無(wú)論n是多少,不再繼續(xù)比較后邊的字符。
【返回值】若str1與str2的前n個(gè)字符相同,則返回0;若s1大于s2,則返回大于0的值;若s1 若小于s2,則返回小于0的值。
注意:如果兩個(gè)字符不同,GCC返回該字符對(duì)應(yīng)的ASCII碼的差值,VC返回-1或1。但是讓人為難的是,strnicmp()、strcmp()、stricmp()在GCC和VC下都返回-1或1,而不是ASCII的差值。
實(shí)例:對(duì)2組字符串進(jìn)行比較。
#include<stdio.h> #include<string.h> int main(void){ char* s1 = "http://see.xidian.edu.cn/cpp/u/xitong/"; char* s2 = "HTTP://see.xidian.edu.cn/cpp/u/xitong/"; char* s3 = "abc"; char* s4 = "abcxyz"; char* s5 = "123456"; char* s6 = "123"; printf("s1-s2=%d\n", strncmp(s1, s2, 20)); // 是否區(qū)分大小寫(xiě) printf("s3-s4=%d\n", strncmp(s3, s4, 100)); // s3的長(zhǎng)度小于s4 printf("s5-s6=%d\n", strncmp(s5, s6, 100)); // s5的長(zhǎng)度大于s6 return 0; }
VC6.0下運(yùn)行結(jié)果:
s1-s2=1 s3-s4=-1 s5-s6=1
GCC下運(yùn)行結(jié)果:
s1-s2=32 s3-s4=-120 s5-s6=52
使用strnicmp()--比較字符串的前n個(gè)字符(區(qū)分大小寫(xiě))
原型為:
int strnicmp ( const char * str1, const char * str2, size_t n );
【參數(shù)】str1, str2 為需要比較的兩個(gè)字符串,n為要比較的字符的數(shù)目。
【返回值】若str1與str2的前n個(gè)字符相同,則返回0;若s1大于s2,則返回大于0的值;若s1 若小于s2,則返回小于0的值。
與strncmp()不同的是,如果兩個(gè)字符不同,GCC和VC都返回-1或1,而不是返回對(duì)應(yīng)的ASCII的差值。
有關(guān)strnicmp()的其他說(shuō)明請(qǐng)查看strncmp(),這里僅舉例演示,不再贅述。
另外一個(gè)不區(qū)分大小寫(xiě)比較字符串前n個(gè)字符的函數(shù)是strncmpi(),strncmpi()是strnicmp()的宏定義,實(shí)際未提供此函數(shù)。
示例:對(duì)6組字符串進(jìn)行比較。
#include<stdio.h> #include<string.h> int main(void){ char* s1 = "http://see.xidian.edu.cn/cpp/u/xitong/"; char* s2 = "HTTP://see.xidian.edu.cn/cpp/u/xitong/"; char* s3 = "abc"; char* s4 = "abcxyz"; char* s5 = "123456"; char* s6 = "123"; printf("s1-s2=%d\n", strnicmp(s1, s2, 20)); // 是否區(qū)分大小寫(xiě) printf("s3-s4=%d\n", strnicmp(s3, s4, 100)); // s3的長(zhǎng)度小于s4 printf("s5-s6=%d\n", strnicmp(s5, s6, 100)); // s5的長(zhǎng)度大于s6 return 0; }
VC6.0下運(yùn)行結(jié)果:
s1-s2=0 s3-s4=-1 s5-s6=1
GCC下運(yùn)行結(jié)果:
s1-s2=0 s3-s4=-1 s5-s6=1
關(guān)于“c語(yǔ)言如何進(jìn)行字符串比較”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。