strncpy()
函数原型
char * strncpy( char * destination, const char * source, size_t num);
从字符串复制字符
将源的前num个字符复制到目标。如果在复制num个字符之前找到源 C字符串的结尾(由空字符表示),则使用零填充目标,直到已向其写入总共num个字符。如果source长于num,则不会 在目标末尾隐式附加空字符。因此,在这种情况下,目标不应被视为空终止的C字符串(因此读取它会溢出)。目标和源不应重叠(重叠时请参阅memmove以获得更安全的替代方案)。
模拟实现
#include<stdio.h>
#include<string.h>
#include<windows.h>
#include<assert.h>
int my_strlen(const char *str) //计数器方法
{
int count = 0;
while (*str){
count++;
str++;
}
return count;
}
int my_strlen2(const char *str) //不创建临时变量计数器
{
if (*str == '\0'){
return 0;
}
else{
return my_strlen(str++) + 1;
}
}
int my_strlen3(char *str) //指针减指针的方式
{
char *p = str;
while (*p != '\0'){
p++;
}
return p - str;
}
char *my_strcpy(char *des, const char *src)
{
char *ret = des;
assert(des != NULL);
assert(src != NULL);
while (*des++ = *src++);
return ret;
}
char *my_strncpy(char *des, const char *src, int num)
{
char *ret = des;
assert(des != NULL);
assert(src != NULL);
int len = my_strlen(src);
int i = 0;
if (len >= num){
while (i < num){
*des = *src;
des++;
src++;
i++;
}
}
else{
while (i < len){
*des = *src;
des++;
src++;
i++;
}
while (i < num){
*des = 0;
des++;
i++;
}
}
return ret;
}
int main()
{
char destination[20] = { 0 };
char *source = "hello world!";
my_strncpy(destination, source, 7); //拷贝7个字符
printf("%s\n", destination);
system("pause");
return 0;
}
strncat()
函数原型
char * strncat(char * destination,const char * source,size_t num);
从字符串追加字符
将源的前num个字符追加到destination,再加上一个终止的null字符。 如果source中 C字符串的长度小于num,则仅复制终止空字符的内容。
模拟实现
#include<stdio.h>
#include<string.h>
#include<windows.h>
#include<assert.h>
char *my_strcat(char *des, const char *src)
{
char *ret = des;
assert(des != NULL);
assert(src != NULL);
while (*des){
des++;
}
while (*des++ = *src++);
return ret;
}
char *my_strncat(char *des, const char *src, int num)
{
char *ret = des;
assert(des != NULL);
assert(src != NULL);
while (*des != '\0'){
des++;
}
while (num--){
*des = *src;
if (*src == '\0'){
break;
}
des++;
src++;
}
return ret;
}
int main()
{
char destination[20] = "hello !";
char *source = " world!";
my_strncat(destination, source, 10);
printf("%s", destination);
system("pause");
return 0;
}
strncmp()
函数原型
int strncmp(const char * str1,const char * str2,size_t num);
比较两个字符串的字符
将C字符串str1的最多num个字符与C字符串str2的字符进行比较。 此函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续使用以下对,直到字符不同,直到达到终止空字符,或者直到num字符在两个字符串中匹配,以先发生者为准。
模拟实现
#include<stdio.h>
#include<string.h>
#include<windows.h>
#include<assert.h>
char *my_strcmp(const char *str1, const char *str2)
{
int ret = 0;
assert(str1 != NULL);
assert(str2 != NULL);
while (!(ret = *(unsigned char *)str1 - *(unsigned char *)str2) && *str2){
++str1;
++str2;
}
if (ret < 0){
ret = -1;
}
else if (ret > 0){
ret = 1;
}
else{
ret = 0;
}
return ret;
}
char *my_strncmp(const char *str1, const char *str2, int num)
{
int ret = 0;
assert(str1 != NULL);
assert(str2 != NULL);
while (num--){
if (*str1 == *str2){
str1++;
str2++;
}
else{
ret = *str1 - *str2;
break;
}
}
if (ret < 0){
ret = -1;
}
else if (ret > 0){
ret = 1;
}
else{
ret = 0;
}
return ret;
}
int main()
{
char *str1 = "hello world!";
char *str2 = "hallo world?";
int ret = my_strncmp(str1, str2, 11);
if (ret == 0){
printf("equal!");
}
else if (ret == -1){
printf("str1 < str2!");
}
else if (ret == 1){
printf("str1 > str2!");
}
system("pause");
return 0;
}