目錄
1.字符分類函數
2.字符轉換函數
3.strlen的使用和模擬實現
4.strcpy的使用和模擬實現
在編程的過程中,我們經常要處理字符和字符串,為了方便操作字符和字符串,C語言標準庫中提
供了一系列庫函數,接下來我們就學習一下這些函數。
1.字符分類函數
C語言中有一系列的函數是專門做字符分類的,也就是一個字符是屬于什么類型的字符的。
這些函數的使用都需要包含一個頭文件是 <ctype.h>?
這些函數的使用方法非常類似,我們就講解一個函數的實例,其他的非常類似:
int islower ( int c );
islower?是能夠判斷參數部分的 ?c??是否是小寫字母的。
通過返回值來說明是否是小寫字母,如果是小寫字母就返回非0的整數,如果不是小寫字母,則返
回0。
練習:
?寫一個代碼,將字符串中的小寫字母轉大寫,其他字符不變。
#include <stdio.h>
#include <ctype.h>
int main ()
{int i = 0;char str[] = "Test String.\n";char c;while (str[i]){c = str[i];if (islower(c))c -= 32;putchar(c);i++;}return 0;
}
代碼解釋:
1.?頭文件
- ?#include <stdio.h>? :要用 ?putchar? 輸出字符,得包含這個標準輸入輸出頭文件。
- ?#include <ctype.h>? :?islower? 函數能判斷字符是不是小寫字母,它在這個字符處理頭文件里。
2.??main? 函數
- 程序從這里開始。?int main? 表示返回整數,?return 0? 說明程序正常結束。
3.?變量
- ?int i = 0? :當索引,用來挨個訪問字符串字符。
- ?char str[] = "Test String.\n"? :存要處理的字符串。
- ?char c? :臨時存從字符串取出的字符。
4.?循環處理
- ?while (str[i])? :只要字符不是結束符 ?'\0'? ,就循環。
- ?c = str[i]? :拿出當前字符放 ?c? 里。
- ?if (islower(c))? :判斷 ?c? 是不是小寫字母,是就執行下面。
- ?c -= 32? :小寫字母ASCII碼減32 ,變成大寫字母。
- ?putchar(c)? :把處理后的字符打印出來。
- ?i++? :準備處理下一個字符。
2.字符轉換函數
C語言提供了2個字符轉換函數:
int tolower ( int c ); //將參數傳進去的大寫字母轉小寫
int toupper ( int c ); //將參數傳進去的小寫字母轉大寫
上面的代碼,我們將小寫轉大寫,是-32完成的效果,有了轉換函數,就可以直接使用 tolower ?函
數。
#include <stdio.h>
#include <ctype.h>
int main ()
{int i = 0;char str[] = "Test String.\n";char c;while (str[i]){c = str[i];if (islower(c))c = toupper(c);putchar(c);i++;}return 0;
}
代碼解釋:
1.?功能:把字符串里的小寫字母轉成大寫并輸出。
2.?頭文件:
- ?stdio.h?:用 ?putchar? 打印字符。
- ?ctype.h?:用 ?islower? 查小寫字母,?toupper? 轉大寫。
3.?變量:
- ?i?:當“指針”,逐個訪問字符串字符。
- ?str?:存要處理的字符串(比如 ?"Test String.\n"?)。
- ?c?:臨時存當前字符。
4.?過程:
- 逐個字符檢查,是小寫字母就轉大寫,然后打印。
- 直到遇到字符串結尾的 ?\0? 才停止。
3.strlen的使用和模擬實現
size_t strlen ( const char * str );
- - 字符串以 ?'\0'??作為結束標志,?strlen?函數返回的是在字符串中 ?'\0'??前面出現的字符個數(不包含 ?'\0'??)。
- - 參數指向的字符串必須要以 ?'\0'??結束。
- - 注意函數的返回值為 ?size_t?,是無符號的(易錯)。
- - ?strlen?的使用需要包含頭文件。
- - 學會?strlen?函數的模擬實現。
#include <stdio.h>
#include <string.h>
int main()
{const char* str1 = "abcdef";const char* str2 = "bbb";if(strlen(str2)-strlen(str1)>0){printf("str2>str1\n");}else{printf("srt1>str2\n");}return 0;
}
代碼解釋:
1.?功能:比較兩個字符串的長度并輸出結果。
2.?頭文件:
- ?stdio.h?:用于輸入輸出(?printf?)。
- ?string.h?:用于使用字符串長度函數 ?strlen?。
3.?變量:
- ?str1? 指向字符串 ?"abcdef"?(長度6)。
- ?str2? 指向字符串 ?"bbb"?(長度3)。
4.?邏輯:
- 計算 ?str2? 長度減 ?str1? 長度:?3-6 = -3?。
- 由于 ?-3? 不大于0,輸出 ?"srt1>str2"?(注意代碼中 ?srt1? 是拼寫錯誤,應為 ?str1?)。
strlen的模擬實現:
?
方式1:
//計數器方式
int my_strlen(const char * str)
{int count = 0;assert(str);while(*str){count++;str++;}return count;
}
代碼解釋:
1.?函數功能:這個函數?my_strlen 用來計算傳入字符串的長度,類似C語言標準庫函數 ?strlen。
2.?參數?const char * str? 表示傳入一個指向字符常量的指針,即傳入字符串的首地址,?const? 修飾意味著函數內不能通過這個指針修改字符串內容。
3.?變量?int count=0;定義一個整型變量?count 作為計數器,初始化為?0?,用來統計字符串字符個數。
4.?斷言?assert(str);?是一個斷言宏,作用是在程序運行時檢查?str 指針是否為空。如果?str 為空,程序會終止并報錯,這能防止后續空指針解引用導致的程序崩潰。
5.?循環計數:
- ?while(*str):只要當前指針指向的字符(?*str )不是字符串結束符 '\0' ,就執行循環體。
- ?count++;:每循環一次,計數器 ?count? 加 ?1? ,統計字符數量。
- ?str++;:將指針向后移動一位,指向下一個字符,以便繼續檢查后續字符。
6.?返回值:return count;當循環結束,說明已經遍歷完字符串,此時返回計數器?count 的值,也就是字符串的長度(不包含結束符'\0')。
4.strcpy的模擬和使用
char* strcpy(char * destination, const char * source );
- - 源字符串必須以 ?'\0'??結束。
- - 會將源字符串中的 ?'\0'??拷貝到目標空間。
- - 目標空間必須足夠大,以確保能存放源字符串。
- - 目標空間必須可修改。
- - 學會模擬實現。
#include <stdio.h>
#include <string.h>int main() {char source[] = "Hello, world!"; // 源字符串char destination[20]; // 目標字符串數組,空間要足夠容納源字符串// 使用strcpy函數將源字符串拷貝到目標字符串strcpy(destination, source); printf("拷貝后的字符串: %s\n", destination);return 0;
}
代碼解釋:
1.?頭文件引入
- ?#include<stdio.h>:用于使用輸入輸出函數,如printf。
- ?#include<string.h>: strcpy?函數的聲明在這個頭文件中,所以要引入。
2.?定義字符串
- ?char source[] = "Hello, world!"; : 定義并初始化源字符串。
- ?char destination[20];? :定義目標字符串數組,這里大小設為?20 ,確保能容納源字符串(包括結束符'\0')。
3.?使用strcpy函數strcpy(destination, source); : 將源字符串source拷貝到目標字符串destination,包括字符串結束符'\0'。
4.?輸出結果printf("拷貝后的字符串: %s\n", destination); : 使用printf函數輸出拷貝后的目標字符串。
本篇內容先到這里,像這種函數還有多個,接下來再為大家一一顯示,希望大家能深入理解,感謝
大家的觀看!
?