hello,大家好呀,感覺我之前有偷偷摸魚了,今天又開始學習啦。加油!!!
文章目錄
- 1. 字符分類函數
- 2. 字符轉換函數
- 3. strlen的使用和模擬實現
- 3.1 strlen 的使用
- 3.1 strlen 的模擬
- 1.計算器方法
- 2.指針-指針的方法
- 3.遞歸的方法
- 4. strcpy的使用和模擬實現
- 5. strcat的使用和模擬實現
- 6. strcmp的使用和模擬實現
- 7. strncpy函數的使用
- 8. strncat函數的使用
- 9. strncmp函數的使用
- 10. strstr的使用和模擬實現
- 11. strtok函數的使用
- 12. strerror函數的使用
1. 字符分類函數
C語言中有一系列的函數是專門做字符分類的,且這些函數在使用時都需要包含頭文件:ctype.h
這些函數的使用大同小異,我舉其中的一個例子:
從上圖可以看出,函數islower是用來判斷是否為小寫字母,我們可以在cplusplus搜索islower函數,它給出的是:如果是小寫字母,則返回非0值;如果不是小寫字母,則返回0.
int main()
{int c = islower('A');int q = islower('a');printf("c=%d\n", c);printf("q=%d\n", q);return 0;//打印結果是:c=0;q=2
}
練習寫一個代碼:將字符串中的小寫字母轉大寫,其他字符不變。(在學習字符轉換函數之后有另外一種方式,大家可以嘗試一下)
#include<stdio.h>
#include<ctype.h>
int main()
{char arr[] = "I am very sad." ;int i = 0;while (arr[i] != '\0'){if (islower(arr[i])){arr[i] = arr[i] - 32;}i++;}//再將字符串輸出,看是否變成大寫printf("%s\n", arr);return 0;
}
2. 字符轉換函數
C語言提供了2個字符轉換函數:
int tolower ( int c ); ------- 轉成小寫--------- //將參數傳進去的大寫字母轉小寫
int toupper ( int c );------- 轉成大寫----------//將參數傳進去的小寫字母轉大寫
int c的意思是傳入一個字符(字符的本質就是ascll碼值),int tolower的意思是返回值為整數
int main()
{char ch = tolower('A');printf("%c\n", ch);char hh = toupper('a');printf("%c\n", hh);
}
之前小寫轉大寫可以將if語句里面改掉
int main()
{char arr[] = "I am very sad." ;int i = 0;while (arr[i] != '\0'){if (islower(arr[i])){arr[i] = toupper(arr[i]);}i++;}//再將字符串輸出,看是否變成大寫printf("%s\n", arr);return 0;
}
3. strlen的使用和模擬實現
3.1 strlen 的使用
1.使用strlen需要包含頭文件:string.h
2.字符串以’\0’ 作為結束標志。
- 比如:“abc” 其實就是‘a’ ‘b’ ‘c’ ‘\0’,一共4個字符。但是strlen只統計’\0‘之前的字符個數。(不包含’\0’)
- 如果字符數組中是char arr[]={‘a’,‘b’,‘c’};的話,則是沒有\0的,什么時候遇到\0不確定。
int main()
{char arr[] = "aaattt";size_t len = strlen(arr);printf("%d\n", len);//6char qqq[]={'a','b'};size_t lee = strlen(qqq);printf("%d\n",lee);//隨機值return 0;
}
3.strlen的返回值是size_t(即無符號整數)
int main()
{char ch1[] = "abc";char ch2[] = "abcdef";if (strlen(ch1) - strlen(ch2) < 0)//3 - 6{printf("ch1<ch2");}else{printf("ch1>ch2");}
}
//最終的結果是ch1>ch2
3-6=-3,小于0,為什么輸出是大于?
在這里說明,strlen的返回值是size_t,無符號整數-無符號整數=還是無符號整數,所以strlen(ch1) - strlen(ch1)的結果其實>0,所以輸出>。
如果非要比較,可以將strlen的返回值強制類型轉換為int,(int)strlen(ch1)-(int)strlen(ch2)。或者直接比較: if (strlen(ch1) < strlen(ch2) )
3.1 strlen 的模擬
1.計算器方法
(1.) 這是最初的版本,之后優化。
size_t my_strlen(char* str)
{int count = 0;while (*str != '\0'){count++;//個數+1str++;//下一個元素的地址}return count;
}
int main()
{char ch[] = "aaaqqq";size_t len = my_strlen(ch);//傳數組傳的是數組名(這里代表的是數組首元素地址)printf("%d\n", len);
}
(2.)1.萬一指針是空指針呢?我們先用斷言判斷一下
2.我們只是想遍歷一遍數組的每個元素,找到\0,并不希望有人將元素修改了,所以用const修飾*ch
#include<assert.h>
size_t my_strlen(const char* str)//用指針變量來接收地址
{int count = 0;assert(str != NULL);while (*str != '\0'){count++;//個數+1str++;//下一個元素的地址}return count;
}
int main()
{char ch[] = "aaaqqq";size_t len = my_strlen(ch);//傳數組傳的是數組名(這里代表的是數組首元素地址)printf("%d\n", len);
}
2.指針-指針的方法
用起始地址-\0的地址=就是中間的元素個數
這幾種方法int main函數里的內容都一樣,之后就不再展示,只展示my_strlen函數里的內容
size_t my_strlen(const char* str)
{int count = 0;assert(str != '\0');int start = str;//這里str還是起始元素的地址while (*str != '\0'){//通過這個循環,使得str里面放的是\0的地址str++;}int end = str;return end - start;
}
3.遞歸的方法
size_t my_strlen(const char* str)
{if (*str != '\0')return 1 + my_strlen(str + 1);elsereturn 0;
}