本文重點
- 1.strlen
- 2.strcpy
- 3.strcat
- 4.strcmp
💜在本專題內 將重點介紹:
??字符函式
??字串函式
??記憶體函式
這些庫函式的使用和注意事項,
這些注意事項有些看似是很不起眼,但是我們必須充分了解以便自己能模擬實作,
所以在看注意事項時,一是要在未來使用時多注意,二是要思考對應需求如何用代碼實作,
有:
🍎求字串長度的函式
1.strlen
🍎長度不受限制的字串函式
1.strcpy
2.strcat
3.strcmp
🍎長度受限制的的字串函式
1.strncpy
2.strncat
3.strncmp
引:
C語言中對字符和字串的處理很是頻繁,但是C語言本身沒有字串型別,字串通常放在
常量字串
和字符陣列
中,
正文開始@邊通書
學習這塊內容,要勤查閱此網站:
點擊直達http://www.cplusplus.com/
1.strlen
下面將圍繞這幾點詳細展開:
🍇strlen函式用來計算字串長度,回傳的是
\0
之前出現字符個數
🍇引數指向字串必須以\0
結束
🍇函式的回傳值型別為size_t
,即無符號整型(易錯)
😇學會strlen的模擬實作(三種方法:1.計數器 2.指標-指標 3.遞回 —不創建任何臨時變數實作求字串長度
)
🍇strlen函式回傳的是無符號整型:
典例:
問輸出結果?
#include <stdio.h>
#include <sting.h>
int main()
{
const char*str1 = "abcdef";
const char*str2 = "bbb";
if (strlen(str2) - strlen(str1)>0)
{
printf("hehe\n");
}
else
{
printf("haha\n");
}
return 0;
}
🍇引數指向字串必須以\0
結束
😇
strlen
的模擬實作—my_strlen
(三種方式)
🐟 計數器
🐟 指標 - 指標
🐟 遞回(不創建臨時變數)
代碼如下:
#include <stdio.h>
size_t my_strlen(char* ptr)
{
if ((*ptr) != '\0')
{
return 1 + my_strlen(ptr+1);
}
else
{
return 0;
}
}
int main()
{
char arr[] = "beatles";
size_t len = my_strlen(arr);
printf("%u\n", len);
return 0;
}
畫圖分析遞回呼叫程序:
2.strcpy
🍇源字串必須以
\0
結束
🍇會將源字串的\0
拷貝到目標空間
🍇目標空間必須足夠的大,能容下源字串內容
🍇目標空間可修改
😇學會strlen的模擬實作
🍇源字串必須以\0
結束
🍇會將源字串的\0
拷貝到目標空間
🍇目標空間必須足夠大
🍇目標空間可修改
😇
strcpy
函式的模擬實作
完美代碼:
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest, const char* src)
{
assert(dest&&src);//斷言-release版本可以優化掉
char* ret = dest;
//1.拷貝字串
//2.遇到\0為止
while (*dest++ = *src++ )
{
;
}
return ret;
}
int main()
{
char arr1[20] = "abc";
char arr2[] = "def";
printf("%s\n", my_strcpy(arr1, arr2));
return 0;
}
剖析:
3.strcat
字串連接/追加,
🍇源字串必須以
\0
結束
🍇目標空間足夠大,能容納下源字串內容
🍇目標空間可修改
🍇自己給自己追加要用strncat
😇strcat
的模擬實作
🍇源字串必須以\0
結束
🍇目標空間足夠大,能容納下源字串內容
😇
strcat
的模擬實作—my_strcat
#include<stdio.h>
#include<assert.h>
char* strcat(char* dest, const char* src)
{
assert(dest&&src);//斷言
char* ret = dest;
//1.找到目標字串末尾'\0'
while (*dest != '\0')
{
dest++;
}
//2.追加字串直到'\0'-與strcpy非常相似
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[20] = "abc";
char arr2[] = "def";
printf("%s\n", strcat(arr1, arr2));
return 0;
}
4.strcmp
😇strcmp
的模擬實作my_strcmp
#include<stdio.h>
#include<assert.h>
int my_strcmp(const char* str1, const char* str2)
{
assert(str1&&str2);
while (*str1 == *str2)
{
if (*str1 == '\0')
return 0;
str1++;
str2++;
}
return *str1 - *str2;
}
int main()
{
char arr1[] = "abcd";
char arr2[] = "abc";
int ret = my_strcmp(arr1, arr2);
printf("%d\n", ret);
if (ret == 0)
{
printf("==\n");
}
else if (ret > 0)
{
printf(">\n");
}
else
{
printf("<\n");
}
}
剖析:
那么,以上strcpy
,strcat
,srtcmp
是沒有長度限制的字串函式,這些函式是相對不安全的,
下篇文章將介紹相對安全的,有長度限制的字串函式strcpy
,strcat
,strcmp
,
有木有發現小邊文章里出現的都是應季水果,小邊天天都在吃哈哈哈哈哈
未完待續@邊通書
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/301084.html
標籤:其他