C語言字符函數和字符串函數
文章目錄
- C語言字符函數和字符串函數
- 1. 字符分類函數
- 2. 字符轉換函數
- 3. strlen
- 4. strcpy
- 5. strcat
- 6. strcmp
- 7. strncpy
- 8. strncat
- 9. strncmp
- 10. strstr
- 11. strtok
- 12. strerror
1. 字符分類函數
C語言中有一系列函數是專門做字符分類的,也就是判斷一個字符屬于什么類型。
使用這些函數需要包含頭文件ctype.h
。
函數 | 如果參數滿足下面條件就為真 |
---|---|
iscntrl | 任何字符 |
isspace | 空白字符:空格 ' ' 、換頁 '\f' 、換行 '\n' 、回車 '\r' 、制表符 '\t' 、垂直制表符 '\v' |
isdigit | 十進制數字0~9 |
igxdigit | 十六進制數字1~9 、a~f 、A~f |
islower | 小寫字母a~z |
isupper | 大寫字母A~Z |
isalpha | 字母a~z 、A~Z |
isalnum | 字母或數字a~z 、A~Z 、0~9 |
ispunct | 標點符號,任何不屬于字母或數字的可打印字符 |
isgraph | 任何圖形字符 |
isprint | 任何可打印字符,包括圖形字符和空白字符 |
使用這些函數的方法幾乎都是一樣的,只需要傳入需要判斷的字符,然后接受對應返回值即可。
2. 字符轉換函數
C語言提供了2個字符轉換函數。
使用這些函數需要包含頭文件ctype.h
。
函數 | 作用 |
---|---|
tolower | 將傳進去的小寫字母轉成大寫 |
toupper | 將傳進去的大寫字母轉成小寫 |
3. strlen
size_t strlen(const char * str)
我們在之前就已經使用過很多次strlen
函數,這里做一下總結:
- 字符串以
'\0'
作為結束標志,strlen函數返回值是在字符串中'\0'
前面出現的個數。 - 參數指向的字符串必須要以
'\0'
結束。 - 注意函數的返回值為
size_t
,size_t
本質上是無符號整數。
#include <stdio.h>
#include <string.h>int main()
{const char* str = "hello world";printf("%d\n", strlen(str)); // 11return 0;
}
4. strcpy
char * strcpy(char * destination, const char * source);
-
函數參數:
destination
:目標字符串。source
:源字符串。- 源字符串的內容將會拷貝到目標字符串中。
-
源字符串必須以
'\0'
結束。 -
源字符串中的
'\0'
會被拷貝到目標字符串中。 -
目標字符串的空間必須足夠大,保證能夠放得下源字符串的內容
-
目標空間必須可變(非
const
)。 -
注意,在VS2022環境下無法直接使用
strcpy
,解決辦法是加上#define _CRT_SECURE_NO_WARNINGS
。在后文有部分函數也會出現這個問題,看到這個警告后,按上述處理即可,后文將不再贅述此類問題。
#include <stdio.h>
#include <string.h>int main()
{const char* str1 = "hello world";char str2[20];strcpy(str2, str1);printf("%s", str2);return 0;
}
5. strcat
char * strcat ( char * destination, const char * source );
-
函數參數:
- destination:目標字符串。
- source:源字符串。
- 源字符串中的內容將被追加到目標字符串。
-
源字符串必須以
'\0'
結束。 -
目標字符串也必須以
'\0'
結束。 -
目標空間必須足夠大,保證能放得下追加后的內容。
-
目標空間必須可變。
#include <stdio.h>
#include <string.h>int main()
{const char* str1 = "hello world";char str2[20] = "123456";strcat(str2, str1);printf("%s", str2);return 0;
}
6. strcmp
int strcmp ( const char * str1, const char * str2 );
-
函數參數
- 兩個待比較的字符串。
- 比較規則,按照字典序比較:
- 從前往后比較兩個字符串相同位置的字符。
- 當字符的ACSII碼值小時,則該字符串更小,反之該字符串更大。
- 當字符相同時,比較下一個位置的字符。
- 當字符串1到末尾時,字符串2還未結束,那么字串1比字符串2小。
- 當兩個字符串內容完全一致時,判定為相等。
-
第一個字符大于第二個字符串則返回大于0的數字。
-
兩個字符串相等則返回0。
-
第二個字符串大于第一個字符串則返回小于0的數字。
#include <stdio.h>
#include <string.h>int main()
{const char* str1 = "hello world123";const char* str2 = "hello world456";int tmp = strcmp(str2, str1);if (tmp > 0)printf("str2 > str1\n");else if (tmp == 0)printf("str2 == str1\n");elseprintf("str2 < str1\n");return 0;
}
7. strncpy
char * strncpy ( char * destination, const char * source, size_t num );
- 函數參數:
- 與strcpy不同的,num代表需要從源字符串拷貝的字符個數。
- 如果源字符串的長度小于num,則拷貝完源字符串后,在目標后面追加
\0
,直到num個。 - 需要注意的是,如果num小于source的長度,那么destination字符串的最后將不會有
\0
,打印時可能會造成越界訪問。
#include <stdio.h>
#include <string.h>int main()
{const char* str1 = "hello world";char* str2[20];char* str3[20];strncpy(str2, str1, 20);strncpy(str3, str1, 5);printf("%s\n", str2);printf("%s\n", str3);return 0;
}
上面打印的str3就出現了越界訪問的問題。
8. strncat
char * strncat ( char * destination, const char * source, size_t num );
- 函數參數:
- 與strcat不同的,num代表需要從源字符串追加的字符個數。
- 如果源字符串長度小于num,則追加整個源字串。
#include <stdio.h>
#include <string.h>int main()
{const char* str1 = "hello world";char str2[20] = "123";char str3[20] = "456";strncat(str2, str1, 20);strncat(str3, str1, 5);printf("%s\n", str2);printf("%s\n", str3);return 0;
}
9. strncmp
int strncmp ( const char * str1, const char * str2, size_t num );
- 函數參數
- 與strcmp不同的,num代表比較前num個字符數。
- 如果待比較的字符串長度比num小,則整個字符串參與比較。
#include <stdio.h>
#include <string.h>int main()
{const char* str1 = "hello world123";const char* str2 = "hello world456";printf("%d\n", strncmp(str1, str2, 5));printf("%d\n", strncmp(str1, str2, 20));return 0;
}
10. strstr
const char * strstr ( const char * str1, const char * str2 );char * strstr ( char * str1, const char * str2 );
- 返回指向str1字符串中第一次出現str2字符串的指針。
- 如果str2不是str1的一部分,則返回NULL。
#include <stdio.h>
#include <string.h>int main()
{const char* str1 = "hello world";const char* str2 = "world";char* p = strstr(str1, str2);printf("%p\n%s\n", p, p);return 0;
}
11. strtok
char * strtok ( char * str, const char * delimiters );
-
函數參數:
- str:需要處理的目標字符串。
- delimiters:字符分隔符合集。
-
遍歷str字符串,如果碰到delimiters中的字符,就將那個字符改成
\0
然后返回開始尋找的位置的指針。 -
如果傳入str指針傳入NULL,則strtok將從上一個被修改成
\0
的字符的后一個位置開始尋找。 -
如果沒有找到,則返回NULL。
#include <stdio.h>
#include <string.h>int main()
{char str1[] = "192.168.0.0";char* p = strtok(str1, ".");while (p){printf("%s\n", p);p = strtok(NULL, ".");}return 0;
}
12. strerror
char * strerror ( int errnum );
-
函數參數:
- errnum:代表錯誤碼,當程序異常退出時,會返回一個錯誤碼。
-
將錯誤碼傳入strerror函數,就可以獲取錯誤碼對應的描述信息,判斷出現了什么錯誤。
打印0~10號錯誤碼對應的錯誤信息:
#include <stdio.h>
#include <string.h>int main()
{for (int i = 0; i <= 10; i++)printf("error code %d : %s\n", i, strerror(i));return 0;
}