2021-08-23 strcat 函数 与 strncat 函数的区别和用法

本文详细介绍了C语言中strcat和strncat两个字符串连接函数的用法和区别。strcat函数用于将一个字符串追加到另一个字符串的末尾,但不能追加自身以避免丢失结束符''导致程序崩溃。strncat函数则增加了可追加的字符数限制,从而避免了这个问题。此外,还提供了两种不同的方法来判断一个字符串是否由另一个字符串旋转得到,分别通过字符串反转和追加自身来实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

strcat 函数 与 strncat 函数的区别和用法

strcat 函数

strcat ( 接成长串;把多个串连接成长串),
( strncat 与 strcat 意思一样,用法不同) 两者所在头文件 <string.h>)

strcat用法:
int a1[] = “abc”;
int a2[] = “abc”;
strcat(a1,a2); 把另一个字符串 追加本身字符的后面(c后面)
请注意 strcat 函数 不能本身追加本身,什么意思呢,让我们来看看下面例题:

strcat (接成长串;把多个串连接成长串)
#include<stdio.h>
#include<string.h>// strcat 所在的头文件(库) string.h ( string - 字符串操作函数)
int main()
{
	char arr1[30] = "abc"; 
	char arr2[] = "def";
	//strcat(arr1, arr1);// strcat(arr1,arr1) err  不能追加本身函数
	//                   // "abc\0" ->  abca ->  abcab -> abcabc
	//                   //在追加本身的过程中,字符串本身已经在改变了。
	//                   //所以,你会发现"\0" 不见了,因为 strcat 是'\0'这个位置,开始追加字符串
	//                   // 所以 在 追加 本身函数的话,会丢失 '\0',strcat 函数在追加字符串时,遇到 追加字符串的'\0',停止追加
	//                   //所以 缺少 '\0'  会导致   strcat 函数 一直往后面找'\0',导致程序崩溃
	int len = strlen(arr1);//  len = 3
	strncat(arr1,arr1,len);//str n cat 函数,多个一个追加个数,就完美的避过了 本身追加本身时,没有'\0',导致程序崩溃

	printf("%s\n", arr1);// abcdef
	return 0;
}

在程序末尾,你会发现有一个 函数,跟strcat很像。即 strcncat 函数,从上程序中,你会发现
strncat 函数,多了一个参数 len,意思是追加的字符串元素的个数,从而 避免了 字符串追加本身的时候,由于丢失‘\0’,而导致的程序崩溃



让我们再来用做一例题

判断一个字符串,是不是由另一个字符串旋转得来的

常规解法:

#include<stdio.h>
#include<assert.h>
#include<string.h>

方法1

void reverse(char *left, char* right)
{
	assert(left&&right);
	while (left<right)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}

void left_move(char*arr, int k)
{
	assert(arr);
	int len = strlen(arr);
	assert(k <= len);// 防止 输入无效旋转(字符只有46,你要转8个,那肯定是不可能的)
	reverse(arr, arr + k - 1);//逆序左边 //arr +k - 1,对应的是 b
	reverse(arr + k, arr + len - 1);//逆序右边    arr +k 对应是是 c
	reverse(arr, arr + len - 1);//逆序整体
}

int is_left_move(char*s1, char*s2)
{
	assert(s1);
	assert(s2);
	int len = strlen(s1);
	int i = 0;
	for (i = 0; i < len; i++)
	{
		left_move(s1, 1);//**这里旋转一次, s1 就已经变了,如果写 + i ,会出现问题(漏掉元素,导致程序不管是哪个字符串,统统输出 No)**
		if (0 == strcmp(s1, s2))//判断旋转过后的s1字符串,是否与 s2 相等。 
		{
			return 1;//相等返回1,表示s2 是 s1 旋转得到的
		}
	}
	return 0;
}

int main()
{
	char arr1[30] = "abcdef";// 30 是为了给第二种方法 提供空间
	char arr2[] = "cdefab";
	int ret = is_left_move(arr1,arr2);
	if (1 == ret)
	{
		printf("Yes\n");
	}
	else
	{
		printf("No\n");
	}
	return 0;
}





第二种解法:

   abcdefabcdef   在字符串后面追加上一个相同的字符串
  你会发现这样写包含了 所有旋转出来的可能性  abcdef  bcedefa,cdefab,defabc,efadbcd,fabcde,abcdef // 去掉相同的,共有6种旋转可能

int is_left_move(char*s1, char*s2)
{
	assert(s1&&s2);
	int len = strlen(s1);
	int len2 = strlen(s2);
	if (len != len2) // 防止缺少元素,缺少元素也是子集,会返回1,输出 yes
		             // 必须保证字符长度一样,因为本题是让我们判断,该字符串,是不是由另一个字符串旋转得来的
	{
		return 0;
	}
	//1.在 s1 字符串中追加一个s1字符串
	strncat(s1, s1, len);// abcedefabcdef
	//2.判断 s2 指向的字符串 是否 是s1指向的字符串的 子串(旋转得到的)
	char* ret = strstr(s1, s2); // strstr 函数,判断 s2 是否 为 s1 的子串(子集)
	if (ret == NULL)
	{
		return 0;
	}
	else
	{
		return 1;
	}
}

int main()
{
	char arr1[30] = "abcdef";// 30 是为了给第二种方法 提供空间
	char arr2[] = "cdefab";
	int ret = is_left_move(arr1,arr2);
	if (1 == ret)
	{
		printf("Yes\n");
	}
	else
	{
		printf("No\n");
	}
	return 0;
}

到这里,想比大家对 strcat 与 strncat 函数 理解更加深刻。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dark And Grey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值