柚子快報(bào)邀請(qǐng)碼778899分享:c語(yǔ)言 字符函數(shù)和字符串函數(shù)
柚子快報(bào)邀請(qǐng)碼778899分享:c語(yǔ)言 字符函數(shù)和字符串函數(shù)
字符分類(lèi)函數(shù)
使用字符函數(shù)需要包含頭文件ctype.h
以下都是符合條件返回真
iscntrl
任何控制字符
isspace
空白字符
isdigit
十進(jìn)制數(shù)字
isxdis
十六進(jìn)制數(shù)字
islower
小寫(xiě)字母
isupper
大寫(xiě)字母
isalpha
字母
isalnum
字母或數(shù)字
ispunct
標(biāo)點(diǎn)符號(hào)和任何不屬于字母的圖形字符
isgraph
任何圖形字符
isprint
任何可打印字符
通過(guò)返回值來(lái)說(shuō)明是否符合,如果符合就返回非0的整數(shù),如果不符合,則返回0。
字符轉(zhuǎn)換函數(shù)
int tolower ( int c ); //將參數(shù)傳進(jìn)去的?寫(xiě)字?轉(zhuǎn)?寫(xiě)
int toupper ( int c ); //將參數(shù)傳進(jìn)去的?寫(xiě)字?轉(zhuǎn)?寫(xiě)
?例子
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
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;
}
strlen的使用和模擬實(shí)現(xiàn)
判斷字符串長(zhǎng)度
原型
size_t strlen ( const char * str );
?字符串以 '\0' 作為結(jié)束標(biāo)志,strlen函數(shù)返回的是在字符串中 '\0' 前面出現(xiàn)的字符個(gè)數(shù)(不包含 '\0')參數(shù)指向的字符串必須要以 '\0' 結(jié)束,注意函數(shù)的返回值為size_t,是無(wú)符號(hào)的
例子
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
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;
}
?
模擬實(shí)現(xiàn)
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
size_t my_strlen(const char* str)
{
size_t count = 0;
while (*str)
{
count++;
str++;
}
return count;
}
int main()
{
char arr1[] = "hello world";
printf("%zd\n", my_strlen(arr1));
return 0;
}
strcpy的使用和模擬實(shí)現(xiàn)
拷貝字符串
原型
char* strcpy(char * destination, const char * source );
源字符串必須以 '\0' 結(jié)束。
會(huì)將源字符串中的 '\0' 拷貝到目標(biāo)空間。
目標(biāo)空間必須足夠大,以確保能存放源字符串。
目標(biāo)空間必須可修改。
函數(shù)返回的是目標(biāo)空間的起始地址
例子
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
int main()
{
char arr1[20] = { 0 };
char arr2[] = "hello world";
strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
?注意:如果目標(biāo)空間不能修改,那么就會(huì)報(bào)錯(cuò)
模擬實(shí)現(xiàn)
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
char* my_strcpy(char* dest, const char* src)
{
char* ret = dest;
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[20] = { 0 };
char arr2[] = "hello world";
my_strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
strcat的使用和模擬實(shí)現(xiàn)
字符串追加
原型
char *strcat( char *strDestination, const char *strSource );
源字符串必須以 '\0' 結(jié)束。
目標(biāo)字符串中也得有 '\0' ,否則沒(méi)辦法知道追加從哪里開(kāi)始。
目標(biāo)空間必須有足夠的大,能容納下源字符串的內(nèi)容。
目標(biāo)空間必須可修改。
函數(shù)返回的是目標(biāo)空間的起始地址
例子
模擬實(shí)現(xiàn)
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
char* my_strcat(char* dest, const char* src)
{
char* ret = dest;
while (*dest)
{
dest++;
}
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[20] = "hello";
char arr2[] = " world";
my_strcat(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
strcmp的使用和模擬實(shí)現(xiàn)
字符串比較
原型
int strcmp( const char *string1, const char *string2 );
第一個(gè)字符串大于第二個(gè)字符串,則返回大于0的數(shù)字
第一個(gè)字符串等于第二個(gè)字符串,則返回0
第一個(gè)字符串小于第二個(gè)字符串,則返回小于0的數(shù)字
比較兩個(gè)字符串中對(duì)應(yīng)位置上字符ASCII碼值的大小
模擬實(shí)現(xiàn)
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
int my_strcmp(const char* str1, const char* str2)
{
while (*str1 == *str2)
{
str1++;
str2++;
}
return *str1 - *str2;
}
int main()
{
char arr1[] = "abcd";
char arr2[] = "abcf";
int ret = my_strcmp(arr1, arr2);
if (ret > 0)
{
printf("%s大于%s\n", arr1, arr2);
}
else if (ret == 0)
{
printf("%s等于%s\n", arr1, arr2);
}
else
{
printf("%s小于%s\n", arr1, arr2);
}
return 0;
}
strncpy函數(shù)的使用
更安全的字符串拷貝
原型
char * strncpy ( char * destination, const char * source, size_t num );
?拷貝num個(gè)字符從源字符串到目標(biāo)空間
如果源字符串的長(zhǎng)度小于num,則拷貝完源字符串之后,在目標(biāo)的后邊追加'\0',直到num個(gè)。
如果源字符串中有6個(gè)字符,但是只拷貝3個(gè)字符過(guò)去,那么就不會(huì)額外多追加'\0'
模擬實(shí)現(xiàn)
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
char* my_strncpy(char* dest, const char* sour, size_t num)
{
int i = 0;
char* ret = dest;
while (num--)
{
*dest++ = *sour++;
if (*sour == '\0')
{
while (num--)
{
*dest++ = *sour;
}
return ret;
}
}
return ret;
}
int main()
{
char arr1[] = "hello worldxxxxxxxx";
char arr2[] = "hello bit";
char* ret = my_strncpy(arr1, arr2, 11);
printf("%s\n", arr1);
return 0;
}
strncat函數(shù)的使用
更安全的字符串追加
原型
char * strncat ( char * destination, const char * source, size_t num );
?將source指向字符串的前num個(gè)字符追加到destination指向的字符串末尾,再追加?個(gè) '\0'?字符如果source指向的字符串的長(zhǎng)度小于num的時(shí)候,只會(huì)將字符串中到'\0'的內(nèi)容追加到destination指向的字符串末尾,'\0'追加后不會(huì)再額外追加其他
模擬實(shí)現(xiàn)
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
char* my_strncat(char* dest, const char* sour, size_t num)
{
char* ret = dest;
while (*dest)
{
dest++;
}
while (num--)
{
*dest++ = *sour++;
if (*sour == '\0')
{
*dest = *sour;
return ret;
}
}
*dest = '\0';
return ret;
}
int main()
{
char str1[100] = "To be\0\\123456789xxx";
char str2[20] = "or not to be";
my_strncat(str1, str2, 5);
printf("%s\n", str1);
return 0;
}
strncmp函數(shù)的使用
更安全的字符串比較
原型
int strncmp ( const char * str1, const char * str2, size_t num );
?較str1和str2的前num個(gè)字符,如果相等就繼續(xù)往后比較,最多比較num個(gè)字母,如果提前發(fā)現(xiàn)不一樣,就提前結(jié)束,大的字符所在的字符串大于另外一個(gè)。如果num個(gè)字符都相等那就返回0
strstr的使用和模擬實(shí)現(xiàn)
查找字符串
原型
char * strstr ( const char * str1, const char * str2);
第一個(gè)字符串大于第二個(gè)字符串,則返回大于0的數(shù)字
第一個(gè)字符串等于第二個(gè)字符串,則返回0
第一個(gè)字符串小于第二個(gè)字符串,則返回小于0的數(shù)字
比較兩個(gè)字符串中對(duì)應(yīng)位置上字符ASCII碼值的大小
模擬實(shí)現(xiàn)
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
char* my_strstr(const char* str1, const char* str2)
{
//如果*str2只有'\0'那就輸出str1指向的字符串
if (*str2 == '\0')
{
return (char*)str1;
}
const char* cur1 = str1;
const char* cur2 = str2;
while (*str1)
{
cur1 = str1;
cur2 = str2;
while (*cur1 == *cur2 && *cur2 != '\0')
{
cur1++;
cur2++;
}
if (*cur2 == '\0')
{
return (char*)str1;
}
str1++;
}
return NULL;
}
int main()
{
char arr1[] = "abaacaaaddf";
char arr2[] = "aaa";
char* ret = my_strstr(arr1, arr2);
if (ret != NULL)
{
printf("%s\n", ret);
}
else
{
printf("找不到");
}
return 0;
}
strtok函數(shù)的使用
分割字符串
原型
char * strtok ( char * str, const char * sep);
sep參數(shù)指向?個(gè)字符串,定義了?作分隔符的字符集合
第?個(gè)參數(shù)指定?個(gè)字符串,它包含了0個(gè)或者多個(gè)由sep字符串中?個(gè)或者多個(gè)分隔符分割的標(biāo) 記。
strtok函數(shù)找到str中的下?個(gè)標(biāo)記,并將其? \0 結(jié)尾,返回?個(gè)指向這個(gè)標(biāo)記的指針。(注:strtok函數(shù)會(huì)改變被操作的字符串,所以在使?strtok函數(shù)切分的字符串?般都是臨時(shí)拷貝的內(nèi)容 并且可修改。)
strtok函數(shù)的第?個(gè)參數(shù)不為NULL ,函數(shù)將找到str中第?個(gè)標(biāo)記,strtok函數(shù)將保存它在字符串中的位置。
strtok函數(shù)的第?個(gè)參數(shù)為 NULL ,函數(shù)將在同?個(gè)字符串中被保存的位置開(kāi)始,查找下?個(gè)標(biāo) 記。
如果字符串中不存在更多的標(biāo)記,則返回 NULL 指針。
?例子
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
int main()
{
char arr1[] = "zhangsan@qq.com";
const char* p = "@.";
char arr2[30] = { 0 };
strcpy(arr2, arr1);
char* ptr = NULL;
for (ptr = strtok(arr2, p); ptr != NULL; ptr = strtok(NULL, p))
{
printf("%s\n", ptr);
}
return 0;
}
strerror函數(shù)的使用
返回錯(cuò)誤碼對(duì)應(yīng)信息
原型
char * strerror ( int errnum );
?在不同的系統(tǒng)和C語(yǔ)?標(biāo)準(zhǔn)庫(kù)的實(shí)現(xiàn)中都規(guī)定了?些錯(cuò)誤碼,?般是放在errno.h這個(gè)頭文件中說(shuō)明的,C語(yǔ)?程序啟動(dòng)的時(shí)候就會(huì)使用一個(gè)全面的變量errno來(lái)記錄程序的當(dāng)前錯(cuò)誤碼,只不過(guò)程序啟動(dòng)的時(shí)候errno是0,表示沒(méi)有錯(cuò)誤,當(dāng)我們?cè)谑褂脴?biāo)準(zhǔn)庫(kù)中的函數(shù)的時(shí)候發(fā)生了某種錯(cuò)誤,就會(huì)講對(duì)應(yīng)的錯(cuò)誤碼,存放在errno中,而一個(gè)錯(cuò)誤碼的數(shù)字是整數(shù)很難理解是什么意思,所以每?個(gè)錯(cuò)誤碼都是有對(duì)應(yīng)的錯(cuò)誤信息的。strerror函數(shù)就可以將錯(cuò)誤對(duì)應(yīng)的錯(cuò)誤信息字符串的地址返回。
#include
#include
#include
int main()
{
FILE* pFile;
//在這個(gè)程序的文件夾中打開(kāi)unexit.txt的文件,用讀的形式
pFile = fopen("unexit.txt", "r");
//如果pFile是NULL就說(shuō)明打開(kāi)失敗
//使用庫(kù)函數(shù)發(fā)生的錯(cuò)誤,就會(huì)把對(duì)應(yīng)的錯(cuò)誤碼會(huì)放在全局變量errno
if (pFile == NULL)
{
printf("Error oprning file unexit.txt:%s\n", strerror(errno));
}
else
{
printf("打開(kāi)文件成功\n");
}
return 0;
}
柚子快報(bào)邀請(qǐng)碼778899分享:c語(yǔ)言 字符函數(shù)和字符串函數(shù)
精彩內(nèi)容
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。