当前位置:   article > 正文

strncat()函数详解及坑

strncat

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; 
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

应用:

#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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在这里插入图片描述

#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]);
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

运行图片


二、注意

分析:

在这里插入图片描述

为什么数组 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");
  • 1
  • 2
  • 3
  • 4
  • 5

三、结论

char *strncat(char *dst, const char *src, size_t n); 
  • 1

使用 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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/713475
推荐阅读
  

闽ICP备14008679号