日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言字符函数

發布時間:2023/12/20 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言字符函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

字符函數 《string.h》

  • 無字符串長度限制的字符串函數
        • 1. strlen 計算字符串長度
        • 2. strcpy 字符串拷貝
        • 3. strcat 字符串追加
        • 4. strcmp 字符串比較
  • 有字符串長度限制的字符串函數
        • 1. strncpy 字符串拷貝
        • 2. strncat 字符串追加
        • 3. strncmp 字符串比較
        • 4. strstr 在字符串中查找另一字符串
        • 5. strtok 切割字符串
        • 6. strerror 解析錯誤碼
    • perror 解析錯誤碼,打印信息
  • 字符操作函數
      • 1. `isdigit` 判斷是否是數字字符
      • 2. islower 判斷是否是小寫字符
  • 字符轉換函
      • tolower 字符轉小寫
      • toupper 字符轉大寫

無字符串長度限制的字符串函數

1. strlen 計算字符串長度

strlen 函數的參數

size_t strlen ( const char * str );
  • strlne 是計算字符 ‘\0’ 之前所有字符的的個數,不包括 \0
  • strlen 的函數返回值是 unsigned int 類型,無符號整形
  • strlen 的參數指向的字符串的結尾必須包涵 \0,字符串是以 \0作為結束標志

strlen 的使用方法

#include<string.h> int main() {char arr[] = { "abcde" };int n = strlen(arr);int i = 0;for (i = 0; i < n; i++){printf("%c ", arr[i]);}return 0; }

關于 strlen 函數的返回值是size_t,也就是uisigned int 的例題

int main() {const char* n = "abcdef";const char* x = "abx";if (strlen(x) - strlen(n) > 0){printf("x > n\n");}else{printf("n > x\n");}return 0; }
  • 題解

上面的例題中,n的字符串個數是 6,x 的字符串個數是 3
3 - 6 = -3
正常的結果是 n > x
但是之前說過 strlen函數的返回的是 size_t,是無符號的
-3 如果被當成無符號數來解讀的話,那就沒有符號位的概念了
-3 就會被解讀成一個超級大的正數,就會大于 0
結果: x > n

2. strcpy 字符串拷貝

strcpy 函數的參數

char* strcpy(char * destination, const char * source );
  • strcpy 字符串拷貝的源字符串必須以 \0 為結束標志
  • strcpy 會將源字符串中的 ‘\0’ 拷貝到目標空間中
  • 拷貝的目標空間必須足夠大,拷貝后能夠存放字符串
  • strcpy 拷貝的字符串必須是可改變的,不能是常量字符串

strcpy 函數的使用
strcpy 里的第一個參數是拷貝的目標空間,第二個參數是拷貝的內容

int main() {char arr[20] = { "################" };char x[] = { "hello china" };strcpy(arr, x);printf("%s", arr);return 0; }

3. strcat 字符串追加

strcat 函數的參數

char * strcat ( char * destination, const char * source );

strcat 字符串追加,是在字符串 A 后面在追加一個字符串 B

  • strcat 的源字符串必須以 \0 為結束標志
  • strcat 的被追加的空間必須能夠存放的下追加的字符串
  • strcat 的源字符串必須是可改變的,不能是常量字符串

strcat 函數的使用

int main() {char arr[20] = { "hello " };char arr2[] = "china";strcat(arr, arr2);printf("%s\n", arr);return 0; }
  • strcat 函數追加會把 arr2 的所有字符串拷貝到arr1里,包括\0

  • arr2拷貝時會把arr1 里的\0 覆蓋,所以 strcat 函數不能 字符串A 追加 字符串A

4. strcmp 字符串比較

strcmp 函數的參數

int strcmp ( const char * str1, const char * str2 );
  • strcmp函數的判斷標準規定:
    第一個字符串大于第二個字符串,則返回大于0的數字
    第一個字符串等于第二個字符串,則返回0
    第一個字符串小于第二個字符串,則返回小于0的數字

  • strcmp 是比較每個字符串的第一個字符, 如果相等,
    則繼續比較下一對字符,直到字符不相等或到達終止空字符

strcmp 函數使用

int main() {char arr[] = { "abcdefg" };char str[] = { "abg" };int ret = strcmp(arr, str);if (ret > 0)printf("arr > str");else if (ret < 0)printf("arr < str");elseprintf("arr == str");return 0; }

有字符串長度限制的字符串函數

1. strncpy 字符串拷貝

strncpy 函數的參數

char * strncpy ( char * destination, const char * source, size_t num );
  • strncpy 和 strcpy 函數的使用方法都差不多,只是多了一個參數 size_t num
  • 多出來的參數是來限制字符串拷貝的長度,增加了安全性
  • 如果源字符串的長度小于num,則拷貝完源字符串之后,在目標的后邊追加\0,直到num個

strncpy 函數的使用

int main() {char arr[25] = { "hello worle!" };char arr2[] = { "For a better tomorrow!########" };strncpy(arr, arr2, 22);printf("%s\n", arr);return 0; }

2. strncat 字符串追加

strncat 函數參數

char * strncat ( char * destination, const char * source, size_t num );
  • 和 strcat 函數使用的方法和規則都差不多,只是多了一個參數 size_t num
  • num 這個參數代表需要追加幾個字符串

strncat 函數使用

int main() {char arr[20] = "hello ";char* str = "world! For a better tomorrow!";strncat(arr, str, 6);printf("%s\n", arr);return 0; }

3. strncmp 字符串比較

strncmp 函數參數

int strncmp ( const char * str1, const char * str2, size_t num );
  • 規則和 strcmp 同上
  • 多出來的一個參數是用來要比較字符串的個數

strncmp 函數使用
比較3個字符串的大小

int main() {char arr[] = { "abgefg" };char str[] = { "abgaaaa" };int ret = strncmp(arr, str,3);if (ret > 0)printf("arr > str");else if (ret < 0)printf("arr < str");elseprintf("arr == str");return 0; }

4. strstr 在字符串中查找另一字符串

strstr 函數參數

char * strstr ( const char *str1, const char * str2);
  • 作用:在A 字符串中查找是否包含 B字符串
    如果 A 中包含 B ,則返回 B 在 A 中首次出現的的地址。
    否則返回空指針!
  • 如果找到,返回的是字符串的地址,所以要用指針變量來接收

strstr 函數使用

int main() {char arr[] = { "abcdefg" };char str[] = { "cde" };char* ret = strstr(arr, str);if (ret == NULL)printf("沒有找到\n");elseprintf("%s\n", ret);return 0; }

5. strtok 切割字符串

strtok 函數參數

char * strtok ( char * str, const char * sep );
  • 第一個參數是一個字符串,它包含了0個或者多個字符

  • 第二個參數是分割字符串,對第一個參數的字符串掃描,碰到了分割字符串中的任意一個
    就把那個字符標記成 ‘\0’ ,然后返回分割字符串之前的地址,并且保存它在字符串中的位置

  • strtok函數第二次查找的第一個參數為 NULL ,函數將在同一個字符串中被保存的位置開始,查找下一個標記
    如果字符串中不存在更多的分割字符,則返回 NULL 指針。

  • strtok函數會改變被操作的字符串,所以在使用strtok函數切分的字符串一般都是臨時拷貝的內容并且可修改

strtok 函數使用
這種方法比較麻煩,而且代碼重復度高

int main() {char* arr = { "zhangsan@china.guandong" };const char* n = "@.";char str[30];strcpy(str, arr);char* tmp = NULL;tmp = strtok(str, n);printf("%s\n", tmp);tmp = strtok(NULL, n);printf("%s\n", tmp);tmp = strtok(NULL, n);printf("%s\n", tmp);return 0; }

簡化版
可以用 for 循環巧妙的達成了,結果都是一樣的

int main() {char* arr = { "zhangsan@china.guandong" };const char* n = "@.";char str[30];char* tmp = NULL;strcpy(str,arr);for (tmp = strtok(str, n); tmp != NULL; tmp = strtok(NULL,n)){printf("%s\n", tmp);}return 0; }

6. strerror 解析錯誤碼

strerror 函數參數

char * strerror ( int errnum );
  • 在使用庫函數的時候,調用庫函數失敗時,都會設置錯誤碼
  • C語言中有一個全局變量叫 errno,只要調用庫函數發生錯誤,就會把錯誤碼放到errno里
  • strerror 會把錯誤碼翻譯成對應的錯誤信息
  • 使用必須包涵頭文件 <errno.h>

srerror的使用
返回的都是對應的錯誤信息

int main() {printf("%s\n", strerror(0));printf("%s\n", strerror(1));printf("%s\n", strerror(2));printf("%s\n", strerror(3));printf("%s\n", strerror(4));printf("%s\n", strerror(5));return 0; }

具體用法:
正常是 strerror 里放 errno,errno 里存放的是錯誤碼

int main() {FILE* pFile;pFile = fopen("test.txt", "r");//打開test.txt,以讀的形式打開文件if (pFile == NULL) // 打開失敗就是空指針printf("%s\n", strerror(errno));//錯誤碼自動保存在 errno 變量當中return 0; }

perror 解析錯誤碼,打印信息

perror 函數參數

void perror(const char* str);
  • perror 的頭文件是 <stdio.h>
  • perror 和 strerror 作用都是一樣的,不過strerror 沒有打印
  • perror 是把錯誤碼轉換成錯誤信息,在打印
int main() {//1. 打開文件失敗時,返回NULLFILE* pd = fopen("test.txt", "r"); if (pd == NULL){perror("錯誤信息");return 1;}// 2. 讀文件// .....//3. 關閉文件fclose(pd);pd = NULL;return 0; }

字符操作函數

函數名如果參數符合下列條件就返回真(非0的數字)
iscntrl任何控制字符
isspace空白字符:空格‘ ’,換頁‘\f’,換行’\n’,回車‘\r’,制表符’\t’或者垂直制表符’\v’
isdigit十進制數字 0~9
sxdigit十六進制數字,包括所有十進制數字,小寫字母a ~ f,大寫字母A ~ F
islower小寫字母a~z
isupper大寫字母A~Z
isalpha字母 a ~ z 或大寫字符 A - Z
salnum字母或者數字,az,AZ,0~9
ispunct標點符號,任何不屬于數字或者字母的圖形字符(可打印)
isgraph任何圖形字符
isprint任何可打印字符,包括圖形字符和空白字符
  • 以上函數的頭文件:<ctype.h>

函數使用示范:

1. isdigit 判斷是否是數字字符

int main() {char ch = '#';int ret = isdigit(ch);printf("%d\n", ret);return 0; }

  • 下面例題可以得知,如果是數字字符,返回的是非0的數字
  • 不是數字字符,返回數字 0
#include<ctype.h>int main() {char ch = '3';int ret = isdigit(ch);printf("%d\n", ret);return 0; }

答案:

2. islower 判斷是否是小寫字符

  • islower 判斷是小寫字符返回的是 非0 ,不是返回 0
#include<ctype.h> int main() {char ch = 'a';int ret = islower(ch);printf("%d\n",ret);return 0; }

答案:

  • 以上只是簡略的寫幾個例子,剩下的用法都是大同小異

字符轉換函

tolower 字符轉小寫

#include<ctype.h> int main() {char arr[20] = { 0 };scanf("%s", &arr);int i = 0;while (arr[i] != '\0'){if (isupper(arr[i])) //判斷是否是大寫字母{arr[i] = tolower(arr[i]);}printf("%c ", arr[i]);i++;}return 0; }

toupper 字符轉大寫

int main() {char arr[20] = { 0 };scanf("%s", &arr);int i = 0;while (arr[i] != '\0'){if (islower(arr[i])) //判斷是否是小寫字母{arr[i] = toupper(arr[i]); //轉換成大寫字符}printf("%c ", arr[i]);i++;}return 0; }

總結

以上是生活随笔為你收集整理的C语言字符函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。