本文重點
- 4.strncpy
- 5.strncat
- 6.strncmp
正文開始@邊通書
🍎上篇文章介紹了沒有長度限制的幾個字串庫函式
strcpy,strcat,strcmp,它們就是上來就是干,直至\0為止,是不太安全的,
本文將繼續介紹相對安全的幾個有長度限制的字串庫函strncpy,strncat,strncmp及其模擬實作,
這些模擬實作都是小邊憑借??顫抖直覺??寫出來的,當然不完美,同時也可以去參考一下標準庫函式,小邊看的時候真是大喊妙絕,但對于新手不建議追求奇淫技巧,以邏輯和可讀性為主,
還有如果小伙伴們發現我代碼哪里有錯,望指出!
4.strncpy

想要很好的模擬實作原邏輯,要先充分了解函式的脾氣,

😇
strncpy的模擬實作—my_strncpy
#include<stdio.h>
#include<assert.h>
char* my_strncpy(char* dest, const char* src, size_t count)
{
assert(dest&&src);//斷言--保證指標有效性
size_t i = 0;
char* ret = dest;
for (i = 0; i < count; i++)
{
*(dest + i) = *(src + i);//拷貝
//若count>字串內容
if (*(src + i) == '\0')
{
for (i += 1; i < count; i++)
{
*(dest + i) = 0;
}
}
}
return ret;
}
int main()
{
char arr1[] = "abcdefghi";
char arr2[] = "xxxx";
char* ret = my_strncpy(arr1, arr2, 6);
printf("%s\n", ret);
return 0;
}
運行結果:

標準庫函式:

5.strncat

想要很好的模擬實作原邏輯,要先充分了解函式的脾氣,

😇
strncat的模擬實作—my_strncat
#include<stdio.h>
#include<assert.h>
char* my_strncat(char* dest, const char* src, size_t num)
{
assert(dest&&src);
size_t i = 0;
char* ret = dest;
//1.找到\0位置
while (*dest)
{
dest++;
}
//2.追加
for (i = 0; i < num; i++)
{
if (*(src + i) == '\0')
{
break;
}
*(dest + i) = *(src + i);
}
*(dest + i) = '\0';//主動添加\0
return ret;
}
int main()
{
char arr1[] = "abc\0xxxxxxxxxx";
char arr2[] = "def";
my_strncat(arr1, arr2, 6);
return 0;
}
運行結果:

參考標準庫函式:

6.strncmp

想要很好的模擬實作原邏輯,要先充分了解函式的脾氣,

😇
strncmp的模擬實作—my_strncmp
#include<stdio.h>
#include<assert.h>
int strncmp(const char* str1, const char* str2, size_t num)
{
assert(str1&&str2);
size_t i = 0;
while (*str1 == *str2)//字符相同
{
i++;
//若遇到\0或已到num仍相同,則回傳0
if ((*str1 == '\0') ||(i==num) )
{
return 0;
}
str1++;
str2++;
}
//若字符不同,則回傳差值
return *str1 - *str2;
}
int main()
{
char arr1[] = "abcwef";
char arr2[] = "ab";
int ret = strncmp(arr1, arr2, 3);
printf("%d\n", ret);
return 0;
}
運行結果:

未完待續@邊通書
??下篇文章將繼續介紹
strstr,strtok,strerrot這些字串庫函式以及字符操作
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/301564.html
標籤:其他
上一篇:指標和陣列試題決議(重置版)
下一篇:通訊錄2.0版本(檔案保存版)
