前言:本章重點介紹字符和字串的庫函式使用,C語言本身是沒有字串型別的,字串通常存放在常量字串或字符陣列中,字串常量適用于那些對它不做修改的字串函式,
文章目錄
- 1.strlen
- 程式1(自行判斷下輸出結果)
- 模擬實作strlen
- 方式1(臨時變數計數器方式):
- 方式2(不創建臨時變數計數器):
- 方式3(指標方式):
- 2.strcpy
- 模擬實作
- 3.strcmp
- 模擬實作
- 4.strcat
- 模擬實作
- 5.strstr
- 案例:
- 模擬實作
- 6.strncpy
- 模擬實作
- 7.strncat
- 模擬實作
- 8.strncmp
- 模擬實作
- 9.strtok
- 例子
- 10.strerror
- 例子
- 11.memcpy
- 模擬實作
- 12.memcmp
- 例子:
- 13.memmove
- 測驗例子
- 模擬實作
1.strlen
作用介紹:求字串長度(不包含\0)

程式1(自行判斷下輸出結果)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char* str1 = "abcdef";
char* str2 = "bbb";
printf("%d ", strlen(str1));
if (strlen(str2) - strlen(str1) > 0)
{
printf("str2>str1\n");
}
else
{
printf("str1>str2\n");
}
return 0;
}
輸出:
模擬實作strlen
方式1(臨時變數計數器方式):
int my_strlen(const char* str)
{
int count = 0;
while (*str)
{
count++;
str++;
}
return count;
}
方式2(不創建臨時變數計數器):
int my_strlen(const char* str)
{
int count = 0;
while (*str)
{
count++;
str;
}
return count;
}
方式3(指標方式):
int my_strlen(const char* str)
{
char* p = str;
while (*p != '\0')
{
p++;
}
return p - str;
}
2.strcpy
作用介紹:拷貝字串


模擬實作
char* my_strcpy(char* dest, const* src)
{
char* ret = dest;
assert(dest != NULL);
assert(src != NULL);
while ((*dest = *src))
{
;
}
return ret;
}
3.strcmp
作用介紹:比較兩個字串是否相等,若字符相同則回傳0

模擬實作
int my_strcmp(char* str1, char* str2)
{
assert(str1 && str2);
while (*str1 == *str2)//判斷字符是否相等
{
if (*str2 == '\0')//判斷是否字符str2結束
{
return 0;
}
else
{
str1++;
str2++;
}
}
if (*str1 > *str2)
{
return 1;
}
if (*str1 < *str2)
{
return -1;
}
}
4.strcat
功能介紹:將source所指向的字串追加到destination所指向的字串后,

模擬實作
char* my_strcat(char* dest, const char* src)
{
assert(dest && src);
char* ret = dest;//用ret記錄dest的首地址,方便后續回傳
while (*dest != '\0');
{
dest++;
}
while (*dest++ = *src++)//將src指向的字串拷到dest后邊
{
;
}
return ret;
}
5.strstr
功能介紹:判斷str2是否在str1中出現,即str2是否為str1的子串,若是,則回傳str2在str1中首次出現的字符地址,否則回傳NULL,
案例:
int main()
{
char str1[] = "abbbcdef";
char str2[] = "bbc";
printf("%s", strstr(str1, str2));
return 0;
}

模擬實作
引入三個臨時變數,下圖中s1與s2就是我們分別指向進行比較的兩個字串(需要移動),首先比較判斷s2是否與s1相同,cp用來記錄當前比較的第一個字符的位置,遍歷cp即可比較str2是否在str1中出現,

char* my_strstr(const char* str1, const char* str2)
{
assert(str1 && str2);
char* s1 = NULL;//不改變str1和str2的指向
char* s2 = NULL;//保留模式串str2
char* cp = (char*)str1;
while (*cp)//cp遍歷str1
{
s1 = cp;
s2 = (char*)str2;
while (*s1 == *s2 && *s1 && *s2)
{
s1++;
s2++;
if (*s2 == '\0')//s2遍歷
return cp;
}
cp++;
}
return NULL;
}
6.strncpy
功能介紹:將source所指向的字串中num個字符拷貝到destination所指向的字串中,

模擬實作
char* my_strncpy(char* dest, const char* src, size_t num)
{
assert(dest && src);
char* cp = dest;
while (num && (*cp++ = *src++))//將src字串中的num個字符拷貝到cp中
{
num--;
}
while (num)//若num人大于0,則將cp中接下來的num個字符置為'\0'
{
*cp++ = '\0';
num--;
}
return dest;
}
7.strncat
功能介紹:在destination所指向的字串末尾加上num個source所指向的字串的字符,

模擬實作
char* my_strncat(char* str1, const char* str2, size_t num)
{
assert(str1 && str2);
char* cp = str1;
while (*cp)//cp遍歷str1至'\0'
{
cp++;
}
while (num--)//將str2中num個字符拷貝到str1中,若num大于str2字串長度,則將str1之后的一個字符置為'\0'
{
*cp++ = *str2++;
if (*str2 == '\0')
return str1;
}
*cp = '\0';
return str1;
}
8.strncmp

模擬實作
int my_strncmp(const char* str1, const char* str2, size_t num)
{
assert(str1 && str2);
while (*str1 == *str2 && num)//str1與str2相等或num不為0是進入回圈
{
str1++;
str2++;
num--;
if (*str2 == '\0' || num == 0)//num等于0或str2與str1已比較完成說明二者相同,回傳0
return 0;
}
if (*str1 > *str2)
return 1;
else
return -1;
}
9.strtok
功能介紹:

例子
int main()
{
char str[] = "150434346@qq.com";
char* sep = "@.";
char tmp[30];
char* cp = NULL;
strcpy(tmp, str);//將str拷貝一份到tmp中,避免strtok將str中的資料修改
for (cp = strtok(tmp, sep); cp; cp = strtok(NULL, sep))
{
printf("%s\n", cp);
}
return 0;
}

10.strerror
功能介紹:回傳錯誤碼所對應的錯誤資訊,

strerror函式的應用在判斷一些操作的錯誤型別時能起到很好的效果,比如在程式未達到預期的效果時,可以通過strerror來判斷錯誤的原因,比如:想打開text.txt檔案時,沒用達到預期效果,可以呼叫該函式來查找原因,
例子
#include <errno.h>
int main()
{
FILE* pFile;
pFile = fopen("unexist.ent", "r");
if (pFile == NULL)
printf("檔案 不存在:%s\n", strerror(errno));
return 0;
}

11.memcpy
功能介紹:

模擬實作
void* my_memcpy(void* dest, const void* src, size_t num)
{
void* ret = dest;
assert(dest && src);
while (num--)//4 3 2 1
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
12.memcmp
功能介紹:

例子:
int main()
{
float arr1[] = { 1.0, 2.0,3.0,4.0 };
float arr2[] = { 1.0, 3.0 };
int ret = memcmp(arr1, arr2, 8);
//memcmp - strcmp
printf("%d\n", ret);
return 0;
}

13.memmove
功能介紹:

測驗例子
int main()
{
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
memmove(arr1, arr1+2, 20);
return 0;
}

模擬實作
void* my_memmove(void* dest, const void*src, size_t num)
{
void* ret = dest;
assert(dest && src);
if (dest < src)
{
//前->后
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
//后->前
while (num--)//19
{
*((char*)dest + num) = *((char*)src + num);
}
}
return ret;
}
注釋:memmove函式的模擬實作要小心指標所指向內容(陣列)被覆寫的問題,
字符和字串的庫函式部分到此介紹結束了,感謝您的閱讀!!!如果內容對你有幫助的話,記得給我三連(點贊、收藏、關注)——做個手有余香的人,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/286646.html
標籤:其他
上一篇:指標的一些筆試題
下一篇:Spring MVC 初始化原始碼(1)—ContextLoaderListener監聽器與根背景關系容器的初始化
