🌟菜鳥主頁:@晨非辰的主頁
👀學習專欄:《C語言學習》
💪學習階段:C語言方向初學者
?名言欣賞:"編程的本質是理解問題,然后把它分解成可執行的步驟。"
目錄
1. 字符分類函數
2. 字符轉換函數
3. strlen函數
3.1 strlen函數使用示范
3.2 strlen的返回值
? 3.3 模擬實現strlen函數
4.?strcpy函數(格式符隱式解引用)
4.1 strcpy函數使用示范
4.2 模擬實現strcpy函數
5. strcat函數
5.1 strcat函數使用示范
5.2 模擬實現strcat函數
1. 字符分類函數
--在C語言中有一系列函數專門做字符分類,判斷一個字符屬于什么類型的字符。
--以下函數都需要包含頭文件:<ctype.h>
? ? ? ?
--這些函數的使用方式十分相似,下面就將一個函數為例解釋:?islower 函數
int lower(int a);
????????--函數判斷字母是否為小寫字母,是-返回非0整數,不是-返回0;
--練習:通過代碼將字符串中的小寫字母轉換為大寫字母:
#include <stdio.h>
#include <ctype.h>
int main()
{char arr[] = "Im a Chinese!";int i = 0;;while (arr[i]){if (islower(arr[i])){arr[i] -= 32;//大寫字母Ascll碼值與小寫字母差32}printf("%c", arr[i]);i++;}return 0;
}
2. 字符轉換函數
--除了上述的字符分類函數,還有這實現字符之間轉換的字符轉化函數;
--使用時包含頭文件:<ctype.h>
int tolower(int c); 將傳進去的大寫字母轉換為小寫字母;
int toupper(int c); 將傳進去的小寫字母轉換為大寫字母;
--有了這兩個函數就可以直接實現大小寫轉換,不用在+-32進行。
--練習:通過代碼利用上述兩個函數實現將字符串中的小寫字符轉換為大寫:
int main()
{char arr[] = "Im a Chinese!";int i = 0;while (arr[i]){if (islower(arr[i])){arr[i] = toupper(arr[i]);}printf("%c", arr[i]);i++;}return 0;
}
3. strlen函數
size_t strlen (const char* str);
--介紹:?
參數: str?—— 指向 '\0'?結尾的字符串的指針;
返回值: size_t?類型的無符號整數,表示字符串的長度(不含 '\0' );
核心功能:計算字符串長度從起始地址開始遍歷,直到遇到 '\0' 結束。
3.1 strlen函數使用示范
--使用須知:
- ?字符串以 '\0'?作為結束標志,strlen函數返回的是在字符串中?'\0'?前面出現的字符個數(不包含?'\0'?);
- 參數指向的字符串必須要以?'\0'?結束;
- 注意函數的返回值為 size_t,是無符號的( 易錯 );
- strlen的使用需要包含頭文件<string.h>;
#include <string.h>
int main()
{const char* str = "abcdef";printf("%zd\n", strlen(str));return 0;
}
3.2 strlen的返回值
--為什么說返回值 size_t類型易錯?請看下面代碼:
#include <string.h>
int main()
{const char* str1 = "abcdef";const char* str2 = "bbb";if (strlen(str2) - strlen(str1) > 0)//一般認為輸出<=,但實際不是{printf(">\n")else{printf("<=\n");}return 0;
}
????????--一般認為上面 3-6 輸出 <=,但實際不是?,輸出 > :因為函數返回類型為無符號整型,所以運算結果也為無符號整型(>=0);想讓它符合我們的認知,可以將類型強轉為 int :
int main()
{const char* str1 = "abcdef";const char* str2 = "bbb";if ((int)strlen(str2) - (int)strlen(str1) > 0){printf(">\n");}else{printf("<=\n");}return 0;
}
? 3.3 模擬實現strlen函數
?--下面將呈現三種方法·,其中兩種方式在前面已經見過:
--方式1:計算器
#include <assert.h>
size_t strlen(char* str)
{int count = 0;int i = 0;assert(str != NULL);while (*str){count++;str++;}return count;
}int main()
{char arr[] = "abcdef";size_t re = strlen(arr);printf("%d\n", re);return 0;
}
--方式2:指針-指針(參考:4.2部分--#C語言——學習攻略:深挖指針路線(一))
size_t my_strlen(char* str)
{assert(str != NULL);char* p = str;while (*str){str++;}return str - p;
}
int main()
{char arr[] = "abcdef";size_t ret = my_strlen(arr);printf("%zd\n", ret);return 0;
}
--方式3:函數遞歸
size_t my_strlen(const char* str)
{assert(str != NULL);if (*str == '\0'){return 0;}else{return 1 + my_strlen(str + 1);}}
int main()
{char arr[] = "abcdef";size_t ret = my_strlen(arr);printf("%d", ret);return 0;
}
4.?strcpy函數(格式符隱式解引用)
char* strcpy(char* destination, cjar* source);
--介紹:
功能:字符串拷貝,將源頭(src)的字符串拷貝到目標(dest )空間中,拷貝到源頭字符串中的 '\0' 為止;
返回值:strcpy函數返回的目標空間的起始地址;
參數:?destination指針,指向目的地空間;source指針,指向源頭數據。
4.1 strcpy函數使用示范
使用須知——
- 源字符串必須以?'\0'?結束;
- 會將源字符串中的?'\0'?拷貝到目標空間;
- 目標空間必須足夠大,以確保能存放源字符串,[ ]里不能為空;
- 目標空間必須可修改(字符串數組),比如常量字符串無法修改;?
- 使用需要包含頭文件<string.h>;
int main()
{char arr1[] = "hello";char arr2[20] = { 0 };char* ret = strcpy(arr2, arr1);printf("%s\n", ret); 無需解引用,%s 自動處理return 0;
}
隱式解引用:
--對于為什么輸出 ret 不使用 %p :當要輸出指針指向的內容時 %s?格式符本質上會隱式解引用指針,
4.2 模擬實現strcpy函數
void my_strcpy(char* dest, char* src)
{while (*dest++ = *src++){;}}
int main()
{char arr1[] = "hello world!";char arr2[] = "*************";my_strcpy(arr2, arr1);printf("%s\n", arr2);return 0;
}
5. strcat函數
char* strcat(char* destination, const char* source);
--介紹:
- 功能:字符串追加,把source指針的源字符串中的所有字符都追加到destination指向的空間中;
- 參數:destination指針,指向目的地空間;source指針,指向源頭數據;
- 返回值:strcat函數返回的目標空間的起始地址;
5.1 strcat函數使用示范
使用須知——
- 源字符串必須以 '\0'?結束;
- 目標字符串中也得有?\0?,否則無法知道追加從哪開始;
- 目標空間必須有足夠的大,能容納下源字符串的內容,[ ]里不能為空;
- 目標空間必須可修改;
- 使用需要包含頭文件<string.h>;
#include <stdio.h>
#include <string.h>int main()
{char arr1[20] = "hello";char arr2[] = "world";char* p = strcat(arr1, arr2);printf("%s\n", p);printf("%s\n", arr1);return 0;
}
5.2 模擬實現strcat函數
char* mystrcat(char* dest, const char* src)
{assert(dest && src);char* p = dest;while (*dest){dest++;}//找到目標字符串中的\0,明確從那里開始追加。while ((*dest++ = *src++)){;}return p;
}
int main()
{char arr1[20] = "hello";char arr2[] = "world";char* ret = mystrcat(arr1, arr2);printf("%s", ret);return 0;
}
結語:本篇文章到此結束,下一篇將會為大家呈現字符函數和字符串函數的剩余內容,如果這篇文章對你的學習有幫助的話,歡迎一起討論學習,你這么帥、這么美給個三連吧~~~