字符串追加函数 strcat和strncat

目录

strcat函数

strncat函数


先下结论:strncat比strcat更安全、方便、好用!

strcat函数

讲解和使用

strcat实现字符串的追加

头文件:<string.h>

注意:

1、两个字符串都要以'\0'结束

2、目标空间可修改

3、要保证destination空间足够追加源字符

4、追加之后source不变,destination发生改变

函数用法如下图:>

过程解析

1、返回值为   char*   类型

2、source会覆盖destination结尾的'\0'

3、source的'\0'会被加上去

char* my_strcat(char* str1, const char* str2)
{

}

过程的实现:>

简化如下:> 

while的条件判断比循环要多一次,所以最后*src为\0时,条件判断中的赋值会进行一次

之后由于条件为0(假),就跳出while

strcat代码

char* my_strcat(char* dest, const char* src)
{
	char* ret = dest;
	while (*dest++);
    dest--;
	while (*dest++ = *src++);
	return ret;
}
int main()
{
	char arr1[30] = "hello ";
	char arr2[] = "world";
	printf("追加前arr1:>%s\n", arr1);
	printf("追加前arr2:>%s\n", arr2);
	my_strcat(arr1, arr2);
	printf("追加后arr1:>%s\n", arr1);
	printf("追加后arr2:>%s\n", arr2);
}

strcat无法给自己追加

由于strcat会从\0开始覆盖,如果写成strcat(arr,arr),会造成死循环,没有尽头


strncat函数

讲解和使用

 头文件:<string.h>

辨析两者:

1、strcat 函数的结束条件是src 来到了 '\0';

     strncat 函数结束的条件则是所要追加的字符个数为0;

2、strcat函数把源字符串整个地连在目标字符串后面;

      strncat可以控制连接的字符个数,用n表示

3、前面讲到strcat无法连接自身。但是strncat可以做到,同时可以控制连接字符的个数。

4、如果n要大于源字符串的长度,则未追加完的字符补充为\0


 过程解析

首先确定返回类型和函数参数

char* my_strncat(char* dest, char* src, int n)

类似strcat,先找到\0的位置,进行覆盖追加,直到将n个字符全部加完

char* my_strncat(char* dest, char* src, int n)
{
	char* ret = dest;
	while (*dest++)
		;
	dest--;//找到\0
	while (n--)
	{
		*dest++ = *src++;
		//当src到达\0时,将\0给dest并且返回dest首地址
		if (*src == '\0')
		{
			*dest = *src;
			return ret;
		}
	}
	//全部追加完之后补充\0
	*dest = '\0';
	return ret;
}

简化之后如下:>

char* my_strncat(char* dest, char* src, int n)
{
	char* ret = dest;
	while (*dest++) ;
	dest--;
	while (n--)
	{
        //条件执行之后再判断,若此时字符串来到为\0
        //0==0,条件判断为真,返回ret
		if ((*dest++ = *src++) == 0)
			return ret;
	}
	*dest = '\0';
	return ret;
}

strncat代码

char* my_strncat(char* dest, char* src, int n)
{
	char* ret = dest;
	while (*dest++) ;
	dest--;
	while (n--)
	{
		if ((*dest++ = *src++) == 0)
			return ret;
	}
	*dest = '\0';
	return ret;
}
int main()
{
	char arr1[30] = "hello ";
	char arr2[] = "world";
	printf("追加前arr1:>%s\n", arr1);
	printf("追加前arr2:>%s\n", arr2);
	my_strncat(arr1, arr2,3);
	printf("追加后arr1:>%s\n", arr1);
	printf("追加后arr2:>%s\n", arr2);
}

strncat可以给自己追加

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
### 回答1: 如果你想自己实现一个 C 字符串类,你可以按照以下步骤来实现: 1. 定义结构体:首先,你需要定义一个结构体来存储字符串的相关信息。你可以包含一个字符数组来存储字符串的内容,以及一个整数来记录字符串的长度。 2. 实现初始化函数:接下来,你可以实现一个初始化函数,用于创建字符串类的实例。你可以在这个函数中,根据传入的参数来初始化字符数组和长度变量。 3. 实现其他操作函数:然后,你可以根据你的需要,实现其他相关的操作函数。例如,你可以实现字符串拼接、比较、查找子串等操作。 4. 注意内存管理:在实现这个字符串类时,要注意内存管理的问题。例如,在拼接字符串时,要注意重新分配内存空间,避免内存泄漏。 ### 回答2: C字符串类是一种用于处理字符串的数据类型。在实现一个C字符串类时,我们首先需要定义一些基本的成员变量和方法。 成员变量: 1. `length`:表示字符串的长度。 2. `capacity`:表示字符串的总容量。 3. `data`:存储字符串的字符数组。 方法: 1. `构造函数`:初始化字符串对象,设置初始容量和长度。 2. `析构函数`:释放字符串对象的内存空间。 3. `拷贝构造函数`:用于创建一个新的字符串对象,内容与已有对象相同。 4. `赋值运算符重载`:将一个字符串对象的内容复制给另一个对象。 5. `获取长度`:返回字符串的长度。 6. `获取容量`:返回字符串的总容量。 7. `获取字符串内容`:返回存储的字符串数据。 8. `修改字符串`:修改字符串对象中存储的字符串。 9. `连接字符串`:将两个字符串对象连接成一个新的字符串对象。 10. `比较字符串`:比较两个字符串对象的内容是否相同。 在实现C字符串类时,需要注意以下几点: 1. 为了支持灵活的字符串长度,可以使用动态内存分配,通过`malloc`和`free`函数进行字符串内存的分配和释放。 2. 为了提高字符串的操作效率,可以动态调整字符串容量,根据实际需要进行扩容和缩容操作。 3. 在修改字符串时,需要注意边界条件和内存溢出的问题。 4. 在连接字符串时,可以先判断字符串对象的容量是否足够,如果不够,则进行扩容操作。 5. 在比较字符串时,可以逐个字符比较,直到遇到不相等的字符或者两个字符串的结束符。 通过实现一个C字符串类,我们可以更方便地处理字符串操作,提高代码的可读性和可维护性。 ### 回答3: C语言中没有现成的字符串类,但可以自己实现一个简单的字符串类。 ``` #include <stdio.h> #include <string.h> #define MAX_LENGTH 100 typedef struct { char data[MAX_LENGTH]; int length; } MyString; void initialize(MyString* myStr) { memset(myStr->data, '\0', sizeof(myStr->data)); myStr->length = 0; } void assign(MyString* myStr, const char* source) { strncpy(myStr->data, source, MAX_LENGTH); myStr->length = strlen(myStr->data); } void concat(MyString* dest, const MyString* src) { strncat(dest->data, src->data, MAX_LENGTH-dest->length-1); dest->length = strlen(dest->data); } void print(const MyString* myStr) { printf("%s\n", myStr->data); } int main() { MyString str1; initialize(&str1); assign(&str1, "Hello"); print(&str1); MyString str2; initialize(&str2); assign(&str2, " World!"); concat(&str1, &str2); print(&str1); return 0; } ``` 上面的例子展示了一个简单的C字符串类的实现。该类包含一个存储字符串数据的字符数组和一个记录字符串长度的整数。使用initialize函数初始化字符串对象,assign函数将给定的const char*类型字符串赋值给字符串对象,concat函数将另一个字符串对象追加到目标字符串对象的末尾,print函数字符串对象打印到控制台。在main函数中展示了如何使用这个自定义的字符串类。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值