目錄
1 字符串比較
1.1 strcmp() 函數
1.2 strncmp() 函數
1.3 示例程序
2 字符串查找?
2.1 strchr() 函數
2.2 strrchr() 函數
2.3 strstr() 函數
2.4 strpbrk() 函數
2.5 示例程序
1 字符串比較
strcmp()
和 strncmp()
函數是C語言標準庫中用于比較兩個字符串的函數。
1.1 strcmp() 函數
strcmp 進行字符串比較,主要是通過比較字符串中的字符對應的 ASCII 碼值, strcmp 會根據 ASCII 編碼依次比較 str1 和 str2 的每一個字符,直到出現了不同的字符,或者某一字符串已經到達末尾(遇見了字符串結束字符' \0 ')。函數原型如下:
#include <string.h>int strcmp(const char *str1, const char *str2);
參數:兩個字符串 str1
和 str2
?
1.2 strncmp() 函數
strncmp()與 strcmp()函數一樣,也用于對字符串進行比較操作,但最多比較前 n 個字符, strncmp()函數原型如下所示:
int strncmp(const char *str1, const char *str2, size_t n);
?參數:兩個字符串 str1
和 str2
?
這兩個函數都接受指針作為參數,指向要比較的字符串。strcmp()
比較兩個完整的字符串,而 strncmp()
只比較每個字符串的前 n
個字符。兩個函數的返回值如下:
- 返回?
0
?如果兩個字符串相等。 - 返回小于?
0
?的值如果第一個字符串在字典序上小于第二個字符串。 - 返回大于?
0
?的值如果第一個字符串在字典序上大于第二個字符串。
1.3 示例程序
下面的示例程序使用 strcmp()
和 strncmp()
函數來比較兩個用戶輸入的字符串。
#include <stdio.h>
#include <string.h>#define MAX_STR_LEN 100 // 定義字符串的最大長度int main()
{char str1[MAX_STR_LEN], str2[MAX_STR_LEN]; // 存儲用戶輸入的兩個字符串int n; // 存儲用戶輸入的參數n,用于strncmp()比較的字符數// 獲取用戶輸入的第一個字符串printf("請輸入第一個字符串:");fgets(str1, MAX_STR_LEN, stdin);str1[strcspn(str1, "\n")] = 0; // 去除末尾的換行符// 獲取用戶輸入的第二個字符串printf("請輸入第二個字符串:");fgets(str2, MAX_STR_LEN, stdin);str2[strcspn(str2, "\n")] = 0; // 去除末尾的換行符// 獲取用戶輸入的參數nprintf("請輸入要比較的字符數n:");scanf("%d", &n);// 確保n不會超過字符串的最大長度n = n > MAX_STR_LEN ? MAX_STR_LEN : n;// 使用strcmp()函數比較兩個完整字符串int strcmp_result = strcmp(str1, str2);printf("使用strcmp()比較兩個完整字符串的結果:");if (strcmp_result == 0) {printf("兩個字符串相等。\n");} else if (strcmp_result < 0) {printf("第一個字符串小于第二個字符串。\n");} else {printf("第一個字符串大于第二個字符串。\n");}// 使用strncmp()函數比較兩個字符串的前n個字符int strncmp_result = strncmp(str1, str2, n);printf("使用strncmp()比較兩個字符串的前%d個字符的結果:", n);if (strncmp_result == 0) {printf("兩個字符串的前%d個字符相等。\n", n);} else if (strncmp_result < 0) {printf("第一個字符串的前%d個字符小于第二個字符串的前%d個字符。\n", n, n);} else {printf("第一個字符串的前%d個字符大于第二個字符串的前%d個字符。\n", n, n);}return 0;
}
程序首先使用 strcmp()
對兩個完整字符串進行比較,然后使用 strncmp()
對兩個字符串的前 n
個字符進行比較。運行結果如下:
2 字符串查找?
字符串查找在平時的編程當中也是一種很常見的操作,譬如從一個給定的字符串當中查找某一個字符或者一個字符串,并獲取它的位置。 C 語言函數庫中也提供了一些用于字符串查找的函數,包括 strchr()、strrchr()、 strstr()、 strpbrk()、 index()以及 rindex()等。下面是每個函數的作用和原型:
index()
和 rindex()
已被標準化的新函數取代,并且可能在某些編譯器中不可用或在未來的C標準中被移除。
2.1 strchr() 函數
strchr() 函數在字符串中查找第一次出現指定字符的位置。函數原型如下:
#include <string.h>char *strchr(const char *s, int c);
s
:要搜索的字符串。c
:要查找的字符。
2.2 strrchr() 函數
strrchr() 函數從字符串末尾開始查找最后一次出現指定字符的位置,參數和返回值與?strchr()
?相同,但是搜索方向是從末尾到開頭。。函數原型如下:
#include <string.h>char *strrchr(const char *s, int c);
s
:要搜索的字符串。c
:要查找的字符
2.3 strstr() 函數
strstr() 函數在字符串中查找第一次出現子字符串的位置。函數原型:
char *strstr(const char *haystack, const char *needle);
haystack
:要搜索的字符串。needle
:要查找的子字符串。
2.4 strpbrk() 函數
strpbrk() 函數在字符串中查找任意字符在另一字符串中首次出現的位置。函數原型如下:
char *strpbrk(const char *s1, const char *s2);
s1
:要搜索的字符串。s2
:包含要查找的字符集的字符串。
2.5 示例程序
下面的示例程序使用 strchr()
、strrchr()
、strstr()
和 strpbrk()
函數來查找字符或子字符串,并使用條件語句檢查是否找到了它們。如果找到了,我們計算字符或子字符串的位置,并打印出來。
#include <stdio.h>
#include <string.h>#define MAX_STR_LEN 100int main() {char str[MAX_STR_LEN]; // 用戶輸入的源字符串char charToFind; // 用戶希望查找的字符char substr[MAX_STR_LEN]; // 用戶希望查找的子字符串char charsToBreak[MAX_STR_LEN]; // 用戶希望用于strpbrk的字符集// 初始化字符串memset(str, 0, MAX_STR_LEN);memset(substr, 0, MAX_STR_LEN);memset(charsToBreak, 0, MAX_STR_LEN);// 獲取用戶輸入的源字符串printf("請輸入源字符串:");fgets(str, MAX_STR_LEN, stdin);str[strcspn(str, "\n")] = 0; // 去除末尾的換行符// 獲取用戶希望查找的字符printf("請輸入要查找的字符:");scanf("%c", &charToFind);scanf("%*c"); // 清除緩沖區中的換行符// 獲取用戶希望查找的子字符串printf("請輸入要查找的子字符串:");fgets(substr, MAX_STR_LEN, stdin);substr[strcspn(substr, "\n")] = 0; // 去除末尾的換行符// 獲取用戶希望用于strpbrk的字符集printf("請輸入用于strpbrk的字符集(例如: 'abc123'):");fgets(charsToBreak, MAX_STR_LEN, stdin);charsToBreak[strcspn(charsToBreak, "\n")] = 0; // 去除末尾的換行符// 使用strchr查找字符char *chrPos = strchr(str, charToFind);printf("strchr找到的位置:%s\n", chrPos ? "找到" : "未找到");if (chrPos) {printf("位置:%zu\n", chrPos - str + 1); // 輸出字符在字符串中的位置}// 使用strrchr從末尾查找字符chrPos = strrchr(str, charToFind);printf("strrchr找到的位置:%s\n", chrPos ? "找到" : "未找到");if (chrPos) {printf("位置:%zu\n", chrPos - str + 1); // 輸出字符在字符串中的位置}// 使用strstr查找子字符串chrPos = strstr(str, substr);printf("strstr找到的子字符串位置:%s\n", chrPos ? "找到" : "未找到");if (chrPos) {printf("位置:%zu\n", chrPos - str + 1); // 輸出子字符串在字符串中的位置}// 使用strpbrk查找任意字符在字符集中首次出現的位置chrPos = strpbrk(str, charsToBreak);printf("strpbrk找到的位置:%s\n", chrPos ? "找到" : "未找到");if (chrPos) {printf("位置:%zu\n", chrPos - str + 1); // 輸出字符在字符串中的位置}return 0;
}
函數運行結果如下:?