? ? ? ?Hello, 大家好,我是一代,今天給大家?guī)碛嘘P字符函數(shù)和字符串函數(shù)的有關知識
? ? ? ?所屬專欄:C語言
? ? ? ?創(chuàng)作不易,望得到各位佬們的互三呦
一.字符函數(shù)
在C語言中有一些函數(shù)是專門為字符設計的,這些函數(shù)的使用都需要包含一個頭文件<ctype.h>
如:(注:以下函數(shù)原型都很相似,都為int 函數(shù)(int 字符))
函數(shù)
iscntrl? ? ? ? ? ? ? ? ? ? ? ?檢查字符是否為可控制字符
isspace? ? ? ? ? ? ? ? ? ??檢查字符是否為一個空格、制表符、換行,換頁’\f‘或回車
isdigit? ? ? ? ? ? ? ? ? ? ? ?檢查字符是否為數(shù)字’0‘-’9‘
isxdigit? ? ? ? ? ? ? ? ? ? ?檢查字符是否為16進制的字符包括所有10進制數(shù)字,小寫字母,a-f,大? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 寫字符A-F
islower? ? ? ? ? ? ? ? ? ? ?檢查字符是否為小寫字母
isupper? ? ? ? ? ? ? ? ? ? 檢查字符是否為大寫字母
isalpha? ? ? ? ? ? ? ? ? ? ?檢查字符是否為可打印字符
isalnum? ? ? ? ? ? ? ? ? ??檢查字符是否為字母或十進制數(shù)字
ispunct? ? ? ? ? ? ? ? ? ? ?檢查字符是否為可打印標點字符(不屬于數(shù)字和字母的圖形字符)
isgraph? ? ? ? ? ? ? ? ? ? ?檢查字符是否為可打印字符(不包括空格)
isprint? ? ? ? ? ? ? ? ? ? ? ?檢查字符是否為可打印字符(包括空格)
以上函數(shù)當條件滿足時的返回值都為非0的整數(shù)
如: islower(c),如果c是小寫字母,返回非零整數(shù),不是小寫字母就返回0
#include<stdio.h>
#include<ctype.h>
int main()
{
printf("%d", islower('b'));
}
二.字符轉換函數(shù)
C語言提供了兩種字符轉換函數(shù)
1.int tolower(int c)? ? 將傳進去的大寫字母轉換為小寫
2.?int upper(int c)? ? 將傳進去的小寫字母轉換為大寫
如:
#include<stdio.h>
#include<ctype.h>
int main()
{
printf("%c", tolower('A'));//將大寫字母轉小寫,如果不為大寫字母則不改變
}
?三.字符串函數(shù)及字符串模擬
這里字符串函數(shù)包含的頭文件都為string.h
一.strlen函數(shù)
函數(shù)原型:size_t strlen (const char*str)
頭文件:string.h
功能:計算字符串長度(字符串以‘\0’為結束標志,strlen函數(shù)返回的是在字符串中‘\0’前面面出現(xiàn)的字符個數(shù))
注意:1.參數(shù)指向的字符串必須以'\0'為結束標志,否則不知道字符串在哪里結束,返回隨機值
2.函數(shù)的返回值為size_t , 是無符號的(下面會舉相關例題)
就strlen的返回值有一個例題:
#include<stdio.h>
#include<string.h>
int main()
{
const char* str1 = "acbdh";
const char* str2 = "ads";
if (strlen(str2) - strlen(str1) > 0)
{
printf(">");
}
else
{
printf("<");
}
return 0;
}
這里很多人會認為輸出的是<,但實際輸出的是>,為什么呢?其實是以為strlen的返回值為size_t,其表示的數(shù)都為無符號數(shù),也就是表示的為正數(shù),比如-1,因為返回類型為size_t,其最高位的符號為表示的就為2的32次方,而不是表示正負號。
strlen函數(shù)模擬實現(xiàn)
方法1:指針減指針,指針減指針表示的是兩個指針之間相差的元素個數(shù)
?
#include<stdio.h>
#include<assert.h>
size_t my_strlen(char*str)
{
assert(str);//防止str為空指針,包含頭文件為assert.h
char* p = str;
while (*str != '\0')
{
str++;
}
return str - p;
}
int main()
{
const char* str1 = "acbdh";
printf("%zd", my_strlen(str1));
return 0;
}
?
?方法2:計數(shù)器方式,用count記錄元素個數(shù)
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* str)
{
assert(str);//防止str為空指針,包含頭文件為assert.h
int count = 0;
while (*str != '\0')
{
str++;
count++;
}
return count;
}
int main()
{
const char* str1 = "acbdh";
printf("%zd", my_strlen(str1));
return 0;
}
方法3:遞歸方式
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* str)
{
assert(str);//防止str為空指針,包含頭文件為assert.h
if (*str == '\0')
return 0;
return my_strlen(str + 1) + 1;
}
int main()
{
const char* str1 = "acbdh";
printf("%zd", my_strlen(str1));
return 0;
}
二.strcpy函數(shù)
函數(shù)原型:char* strcpy(char* destination ,const char* source)
功能:把源字符串復制到目標字符串
注意:1.源字符必須以‘\0’結束
2.會將源字符串的‘\0’拷貝到目標空間
3.目標空間足夠大,以確保能夠存放源字符串
4.目標空間必須可修改
strcpy的模擬實現(xiàn)
?
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* str1, char* str2)
{
assert(str1 && str2);
char* s = str1;
while (*str1++ = *str2++);//先解引用在++
return s;
}
int main()
{
char str1[] = "acbdh";
char* str2 = "acb";
printf("%s", my_strcpy(str1,str2));
return 0;
}
?
三.strcat函數(shù)
函數(shù)原型:char* strcat(char*dest,const char*str)
功能:將兩個字符串拼接起來,將str拼接到dest上
注意:1.源字符串必須以'\0'結束
2.目標字符串中也得有‘\0’,否則沒辦法知道從哪里開始拼接
3.目標空間足夠大,能容納下源字符的內容
4.目標空間必須可修改
strcat模擬實現(xiàn)
#include<stdio.h>
#include<assert.h>
char* my_strcat(char* str1,const char*str2)
{
assert(str1&&str2);//防止str為空指針,包含頭文件為assert.h
char* s = str1;
while(*str1)
{
str1++;
}
while (*str1++ = *str2++);//當*str2為'\0'時表達式結果為假
return s;
}
int main()
{
char str1[20] = "acbdh";
const char* str2 = "sad";
printf("%s", my_strcat(str1,str2));
return 0;
}
四.strcmp函數(shù)
函數(shù)原型:int strcmp(char*str1,char*str2)
功能:比較兩個字符串的大小,若第一個字符串大于第二個字符串,則返回大于0的數(shù)字
第一個字符串小于第二個字符串,則返回小于0的數(shù)字
第一個字符串等于第二個字符串,則返回0
注意:比較兩個字符串大小是用ascii值比較,一個一個字符比較
strcmp函數(shù)模擬
#include<stdio.h>
#include<assert.h>
int my_strcmp(char* str1,const char*str2)
{
assert(str1&&str2);//防止str為空指針,包含頭文件為assert.h
while (*str1 == *str2)
{
if (*str1 == '\0')//代表*str1和*str2都為'\0'
return 0;
str1++;
str2++;
}
return *str1 - *str2;
}
int main()
{
const char *str1 = "acbdh";
const char* str2 = "sad";
printf("%d", my_strcmp(str1,str2));
return 0;
}
?五.strncpy函數(shù)
函數(shù)原型:char* strncpy(char* destination,char *source,size_t num)
功能:拷貝num個字符從源字符串到目標空間
注意:如果源字符串的長度小于num,則拷貝完源字符后,到目標空間的后邊追加'\0',直至num個
strncpy函數(shù)模擬
#include <stdio.h>
#include <string.h>
#include<assert.h>
char* my_strncpy(char* str1, const char* str2, size_t n)
{
assert(str1 && str2);
char* s = str1;
for(int i=0;i<n && str2!='\0';i++)
{
*str1++ = *str2++;
}
*str1 = '\0';
return s;
}
int main()
{
char str1[20]="name ";
char str2[20]="str";
printf("%s", my_strncpy(str1, str2, 1));
}
六.strncat函數(shù)
函數(shù)原型:char*strncat(char* destination ,const char*source ,size_t num)
功能 :將source指向字符串的前num個字符追加到destination指向的字符串末尾,再追加?個 \0 字符
注意:如果source 指向的字符串的長度小于num的時候,只會將字符串中到'\0'的內容追加到destination指向的字符串末尾
strncat模擬
#include<stdio.h>
#include<assert.h>
char* my_strncat(char* dest, char* str, size_t n)
{
assert(dest && str);
int i;
char* s = dest;
while (*dest != '\0')
{
dest++;
}
for (i = 0; i < n && str[i] != '\0'; i++)
{
dest[i] = str[i];
}
dest[i] = '\0';
return s;
}
int main()
{
char str[] = { "abcd" };
char dest[20] = { "mnkj***\0***" };
char* ret = my_strncat(dest, str, 2);
printf("%s", ret);
}
七.strncmp函數(shù)
函數(shù)原型:(const char*str1, const char*str2,size_t num)
功能: 比較str1和str2的前num個字符,如果相等就繼續(xù)往后?較,最多比較num個字?,如果提前發(fā)現(xiàn)不一樣,就提前結束。如果num個字符都相等,就是相等返回0,如果str字符串<str2字符串,就返回小于0的數(shù),反之,返回大于0的數(shù)
strncmp函數(shù)模擬
#include<stdio.h>
#include<assert.h>
int my_strncmp(const char* str1, const char* str2,size_t num)
{
assert(str1 && str2);//防止str為空指針,包含頭文件為assert.h
while (*str1 == *str2&& num--)
{
if (*str1 == '\0')//代表*str1和*str2都為'\0'
return 0;
str1++;
str2++;
}
if (num == 0)
{
return 0;
}
return *str1 - *str2;
}
int main()
{
const char* str1 = "afbdh";
const char* str2 = "afbh";
printf("%d", my_strncmp(str1, str2, 9));
return 0;
}
八.strstr函數(shù)
函數(shù)原型:char* strstr(const char *str1,const char*str2)
功能:?返回字符串str2在字符串str1中第?次出現(xiàn)的位置
strstr函數(shù)模擬
#include<stdio.h>
#include<assert.h>
char* my_strstr(const char* str1, const char* str2)
{
assert(str1 && str2);
const char* p1 = NULL;
const char* p2 = NULL;
const char* cur = str1;
if (*str2 == '\0')
return str1;
while (*cur)
{
p1 = cur;//記錄str1開始的起始位置
p2 = str2;//記錄str2的位置
while (*p1 == *p2 && *p1 != '\0' && *p2 != '\0')
{
p1++;
p2++;
}
if (p2 == '\0')
{
return (char*)cur;//將const char*強轉
}
if (*p1 == '\0')
{
return NULL;
}
cur++;//起始位置不可以,刷新起始位置
}
return NULL;
}
int main()
{
char a[] = { "abbbcde" };
char b[] = { "bc" };
printf("%s", my_strstr(a, b));
}
?九.strtok函數(shù)
函數(shù)原型:char* strtok(char*str1, const char*str2)
功能: 將str1進行分割,str2中包含分割符(第?個參數(shù)指定?個字符串,它包含了0個或者多個由str2字符串中?個或者多個分隔符分割的標記)
注意:1.strtok函數(shù)找到str1中出現(xiàn)的分割符,將其標記,并將其之前的字符串? \0 結尾,返回?個指向這個標記的指針,下次用的時候第一個參數(shù)為NULL。(注: strtok函數(shù)會改變被操作的字符串,所以在使?strtok函數(shù)切分的字符串?般都是臨時拷貝的內容 并且可修改。)
2.strtok函數(shù)的第?個參數(shù)不為 NULL ,函數(shù)將找到str中第?個標記,strtok函數(shù)將保存它在字符串中的位置。
3.strtok函數(shù)的第?個參數(shù)為 NULL ,函數(shù)將在同?個字符串中被保存的位置開始,查找下?個標記。
4.如果字符串中不存在更多的標記,則返回 NULL 指針。
strstr使用示例
#include<stdio.h>
#include<string.h>
int main()
{
char a[] = { "zhju.sj@sj" };
char* sep = ".@";
char* str = NULL;
for (str = strtok(a, sep); str != NULL; str = strtok(NULL, sep))
{
printf("%s\n", str);
}
}
九.strerror函數(shù)
函數(shù)原型:char*strerror (int errnum)文章來源:http://www.zghlxwxcb.cn/news/detail-841734.html
功能:strerror函數(shù)可以把參數(shù)部分錯誤碼對應的錯誤信息的字符串地址返回來。 在不同的系統(tǒng)和C語言標準庫的實現(xiàn)中都規(guī)定了?些錯誤碼,?般是放在 errno.h 這個頭文件中說明 的,C語言程序啟動的時候就會使?一個全面的變量errno來記錄程序的當前錯誤碼,只不過程序啟動的時候errno是0,表示沒有錯誤,當我們在使用標準庫中的函數(shù)的時候發(fā)生了某種錯誤,就會講對應 的錯誤碼,存放在errno中,而?個錯誤碼的數(shù)字是整數(shù)很難理解是什么意思,所以每?個錯誤碼都是 有對應的錯誤信息的。strerror函數(shù)就可以將錯誤對應的錯誤信息字符串的地址返回。文章來源地址http://www.zghlxwxcb.cn/news/detail-841734.html
到了這里,關于C語言字符函數(shù)和字符串函數(shù)詳解的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!