欢迎光临
我们一直在努力

strncat函数的实现,concatenate str to str

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移到字符串末尾,指向vps云服务器’\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;}

55394350

赞(0)
【声明】:本博客不参与任何交易,也非中介,仅记录个人感兴趣的主机测评结果和优惠活动,内容均不作直接、间接、法定、约定的保证。访问本博客请务必遵守有关互联网的相关法律、规定与规则。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。