strncat()函数详解及坑
数组中没有将第二个数组中前N个字符追加到第一个数组的尾部的函数
但是char类型数组本身就是表示字符串的啊,直接强制转换成char*不就可以了吗? ->其实还是有点区别的
一、strncat测试及应用
strncat函数源码: 大致写法是这个样子滴
//返回值char* 数组 直接修改了dst数组;
//参数: char *dst:目标字符串 const char *src:源字符串 size_t n:插入src的字节数
char *strncat(char *dst, const char *src, size_t n)
{
if (n != 0)
{
//保存两个操作字符串的首地址
char *d = dst;
const char *s = src;
//将指向dst的指针d移到字符串末尾,指向'\0'
while (*d != 0)
d++;
//复制过程
do {
//如果到达了src字符串的末尾,则复制终止
if ((*d = *s++) == 0)
break;
//移向下一个元素
d++;
} while (--n != 0); //复制后剩余要复制的元素个数
*d = 0; //复制完毕后,将最后一个元素置为'\0'
}
return dst;
}
应用:
#include <stdio.h>
#include <string.h>
int main(void )
{
char str[10] = {0};
char dst[20] = {0};
strcpy(str, "123456");
memcpy(dst, "\x42\x43\x44\x45\x46\x47\x48", 7);
strncat(dst, str, 3);
printf("%s\n", dst);
}
#include <stdio.h>
#include <string.h>
int main(void )
{
int i =0;
char str[10] = {0};
char sendByte[12] = {0};
memcpy(str, "\x42\x43\x44\x45\x00\x46\x47", 7);
printf("字节输出:\n");
for(i=0; i<10; i++)
{
printf("%X\t", str[i]);
}
printf("\n字符串输出:%s\n", str);
sendByte[0] = 0x1F;
//7 -> 表示追加过之后的位置下标
strncat(sendByte, str, 7);
sendByte[11] = 0x1A;
printf("追加后字节输出:\n");
for(i=0; i<12; i++)
{
printf("%X\t", sendByte[i]);
}
}
二、注意
分析:
为什么数组 str 没有全部追加到sendByte数组上?
首先,发现,函数的char *strncat(char *dst, const char *src, size_t n) 中参数 src如果结束,整个程序就会结束;
//如果到达了src字符串的末尾,则复制终止
其次,这里边最重要的一点就是,数组中的0x00 对应着 字符串中的 ‘\0’
也就是说当char str[] 数组中,比如这段字符 “\x42\x43\x44\x45\x00\x46\x47” /x00 -> 0x00 ,此时字符串就只能显示0x42-0x45, 表示是这一段的字符串,因为字符串看到 ‘\0’就以为是结束
作为char类型数组,我们可以任意赋值,一般可以这样赋值
char str[10] = {0};
//数组赋值
memcpy(str, "\x42\x43\x44\x45\x00\x46\x47", 7);
//字符串赋值
strcpy(str, "BCDEF");
三、结论
char *strncat(char *dst, const char *src, size_t n);
使用 strncat 追加字符串可以的,但是如果追加数组一定要考虑清楚自己的数组中会不会出现0x00这个值?
四、解决方案
将src数组插入dst数组中的 下标 start开始到end结束
//将src数组插入dst数组中的 下标 start开始到end结束
//参数:
//char *dst:目标数组
//const char *src:源数组
//int start:开始插入下标位置
//int end:结束插入下标位置
//注意:可能遇到数组越界问题,操作请谨慎
int memcat(char *dst, const char *src, int start, int end)
{
int ret = 0;
ret = (dst != NULL) && (src != NULL) && (start >= 0) && (start <= end);
if(ret)
{
int i = start;
for(; i <= end; i++)
{
*(dst + i) = *src++;
}
}
return ret;
}