strncat()函数详解及坑

1 篇文章 0 订阅

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;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值