C語言 - 第十五章 | 字串 - 比較、搜尋
比較
若要進行字串的比較,可以使用strcmp()
或strncmp()
。
1 2
| int strcmp(const char*, const char*); int strncmp(const char*, const char*, size_t);
|
strcmp(str1, str2)
會比較字串str1
與str2
的大小,若相同就傳回0
,str1
大於str2
則傳回大於0
的值,小於則傳回小於0
的值,比較的標準是依字典順序。例如str1
大於str2
,表示str1
在字典中的順序是在str2
之後。
strncmp()
則是比較兩個字串中指定的字元數目是否相同。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| #include <stdio.h> #include <string.h>
int main() {
char passwd[] = "123456"; char input[7];
printf("請輸入密碼:"); fgets(input, sizeof(input) / sizeof(input[0]), stdin);
if (strcmp(passwd, input) == 0) { puts("密碼正確"); } else { puts("密碼錯誤"); }
return 0; }
|
註:input
大小為7
,所以不管輸入多長最後都會被截取大小為7
。如果輸入1234567
依然會顯示密碼正確。
搜尋
strstr()
C
標準函式庫也提供了搜尋字串的相關函式,先來看到strstr()
函式。
1
| char* strstr(const char*, const char*);
|
- 第一個參數是被搜尋字串
- 第二個參數是想要搜尋的子字串
- 如果沒找到子字串則傳回
NULL
,如果搜尋到第一個符合的子字串,則傳回符合位置的指標,若想要得知子字串是在哪一個索引位置,則可以利用該指標減去字串(字元陣列)開頭的指標,得到的位移量即為符合的索引位置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| #include <stdio.h> #include <string.h> #define LENGTH 80
int main() {
char source[LENGTH]; char search[LENGTH];
printf("輸入字串:"); fgets(source, LENGTH, stdin);
printf("搜尋子字串:"); fgets(search, LENGTH, stdin);
search[strlen(search) - 1] = '\0';
char* loc = strstr(source, search);
if (loc == NULL) { printf("找不到符合的子字串\n"); } else { printf("在索引位置 %lu 處找到子字串\n", loc - source); }
return 0; }
|
strspn()
相對於strstr()
函式找出符合的子字串,strspn()
函式則用來比較兩個字串,找出兩個字串中開始不匹配的地方。
1
| size_t strspn(const char*, const char*);
|
strspn()
會傳回兩個字串開始不匹配的第一個字元索引位置,否則傳回0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| #include <stdio.h> #include <string.h> #define LENGTH 80
int main() {
char str1[LENGTH]; char str2[LENGTH];
printf("輸入字串:"); fgets(str1, LENGTH, stdin);
printf("搜尋子字串:"); fgets(str2, LENGTH, stdin); str1[strlen(str1) - 1] = '\0'; str2[strlen(str2) - 1] = '\0';
size_t loc = strspn(str1, str2);
if (loc == strlen(str1)) { printf("完全匹配\n"); } else { printf("從索引位置 %lu 處開始不匹配\n", loc); }
return 0; }
|
strchr()
、strrchr()
、strcspn()
、strpbrk()
strchr()
函式找出字串中的指定字元第一次出現,若找到則傳回該字元的指標,否則傳回NULL
,可以用找到的指標位置減去字串(字元陣列)開頭位址,如此就可以得到其於字串中的索引位置,而strrchr()
則是與strchr()
類似,只不過它是反向搜尋。
1 2
| char* strchr(const char*, int); char* strrchr(const char*, int);
|
strcspn()
函式則是找出一個字串中與另一個字串任何字元第一次匹配的索引位置。
1 2
| size_t strcspn(const char*, const char*); size_t strpbrk(const char*, const char*);
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| #include <stdio.h> #include <string.h> #define LENGTH 80
int main() {
char str1[LENGTH]; char str2[LENGTH];
printf("輸入字串:"); fgets(str1, LENGTH, stdin);
printf("搜尋子字串:"); fgets(str2, LENGTH, stdin); str2[strlen(str2) - 1] = '\0';
size_t loc = strcspn(str1, str2);
if (loc == strlen(str1)) { printf("沒有任何字元匹配\n"); } else { printf("索引位置 %lu 處匹配到字元\n", loc); }
return 0; }
|
註:strpbrk()
函式則與strcspn()
類似,只不過完全不匹配的話,則傳回NULL
。
註:以上參考了
hackersir gitbooks
字串比較、搜尋