首页 > 编程知识 正文

strncat函数的实现,concatenate str to str

时间:2023-05-03 21:08:43 阅读:265419 作者:3120

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移到字符串末尾,指向'' while (*d != 0) d++; //复制过程 do { //如果到达了src字符串的末尾,则复制终止 if ((*d = *s++) == 0) break; //移向下一个元素 d++; } while (--n != 0); //复制后剩余要复制的元素个数 *d = 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, "x42x43x44x45x46x47x48", 7); strncat(dst, str, 3); printf("%sn", dst);}

#include <stdio.h>#include <string.h>int main(void ){int i =0;char str[10] = {0};char sendByte[12] = {0};memcpy(str, "x42x43x44x45x00x46x47", 7);printf("字节输出:n"); for(i=0; i<10; i++){printf("%Xt", str[i]);}printf("n字符串输出:%sn", str);sendByte[0] = 0x1F; //7 -> 表示追加过之后的位置下标strncat(sendByte, str, 7);sendByte[11] = 0x1A;printf("追加后字节输出:n"); for(i=0; i<12; i++){printf("%Xt", sendByte[i]);}}

二、注意 分析:

为什么数组 str 没有全部追加到sendByte数组上?

首先,发现,函数的char *strncat(char *dst, const char *src, size_t n) 中参数 src如果结束,整个程序就会结束;

//如果到达了src字符串的末尾,则复制终止

其次,这里边最重要的一点就是,数组中的0x00 对应着 字符串中的 ‘’

也就是说当char str[] 数组中,比如这段字符 “x42x43x44x45x00x46x47” /x00 -> 0x00 ,此时字符串就只能显示0x42-0x45, 表示是这一段的字符串,因为字符串看到 ‘’就以为是结束

作为char类型数组,我们可以任意赋值,一般可以这样赋值

char str[10] = {0};//数组赋值memcpy(str, "x42x43x44x45x00x46x47", 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;}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。