C语言 复制字符串

#include <stdio.h>
#define LENGTH 128

char* str_copy(char *p, const char *s){
	char *t = p;
	
	while (*p++ = *s++){
		
	}
	
	return t;
}

int main(void){
	char str[LENGTH] = "";
	char tmp[LENGTH];
	
	printf("str = \"%s\"\n", str);
	
	puts("请输入要复制的字符串:");
	scanf("%s", tmp);
	
	str_copy(str, tmp);
	
	puts("将 tmp 复制给 str 后:");
	printf("str = \"%s\"\n", str);
	
	return 0; 
}

运行结果:
在这里插入图片描述

  • 通过 *p = *s 进行赋值
    首先进行的是 *p = *s 的赋值。指针 s 指向的字符会被赋值给指针 d 指向的字符。
  • 指针 p 和 s 递增
    赋值结束后, p 和 s 递增。指针 p 和 s 分别指向了下一个字符。
    函数开始执行时,指针 s 指向字符串 tmp 的第一个字符,指针 p 指向字符串 str 的第一个字符串。
  • 只要 s 指向的字符不是 null 字符,就将 s 指向的字符赋给 p 指向的字符,然后使 p 和 s 递增,再处理下一个字符。
    当赋给 *p 的字符为 null 字符时,while语句的循环就结束了。

也可将str_copy 函数

char* str_copy(char *p, const char *s){
	char *t = p;
	
	while (*p++ = *s++){
		
	}
	
	return t;
}

换成如下函数

char* str_copy(char *p, const char *s){
	int i = 0;
	char *t = p;
	
	while (p[i] = s[i]){
		i++;
	}
	
	return t;
}

p[i] 和 s[i] 分别是 *(p + i) 和 * (s + i),即访问指针p 和 s 所指向的字符之后第 i 个字符的表达式。为了访问指针所指元素后第 i 个字符,分别对指针 p 和 s 进行了两种运算。

两个函数进行对比
while (*p++ = *s++)
  • 不需要用于下标的变量 i ,可以节约少量内存。
  • 运行效率有望更高。

如果将

char str[LENGTH] = "";

换成

char *str = "";

会导致程序运行异常。

注:
不要改写字符串字面量,也不要对超过字符串字面量的内存空间进行写入操作。


str_copy(str, tmp);
puts("将 tmp 复制给 str 后:");
printf("str = \"%s\"\n", str);

可以简写成:

puts("将 tmp 复制给 str 后:");
printf("str = \"%s\"\n", str_copy(str, tmp));

首先将字符串 tmp 复制到字符串 str,然后再将复制后的 str 显示出来。
传入printf 函数的正是“指向复制后的字符串的第一个字符的指针”。


使用strcpy函数复制字符串
头文件原型说明返回值
#include<string.h>char *strcpy(char *s1, const char *s2)将s2指向的字符串复制到s1指向的数组中。若s1和s2指向的内存空间重叠,则作未定义处理。返回s1的值。
#include <stdio.h>
#include <string.h>

int main(void){
	char str[] = "";
	char *p = "vvcat";
	
	printf("复制后str = \"%s\"", strcpy(str, p));
	
	return 0;
} 

strcpy函数的实现

char *strcpy(char *s1, const char *s2){
	char *tmp = s1;
	
	while (*s1++ = *s2++){
		
	}
	
	return tmp;
}
strncpy函数控制字符串复制的个数
头文件原型说明返回值
#include<string.h>char *strncpy(char *s1, const char *s2, size_t n)将s2指向的字符串复制到s1指向的数组中。若s2的长度大于等于n,则复制到第n个字符为止。否则用null字符填充剩余部分。若s1和s2指向的内存空间重叠,则作未定义处理。返回s1的值。
#include <stdio.h>
#include <string.h>

int main(void){
	char str[] = "";
	char *p = "vvcat";
	
	printf("复制后str = \"%s\"", strncpy(str, p, 4));
	
	return 0;
} 

运行结果:
在这里插入图片描述

strncpy函数的实现

char *strncpy(char *s1, const char *s2, size_t n){
	char *tmp = s1;
	
	while (n){
		if (!(*s1++ = *s2++)){
			break;
		}
		n--;
	}
	
	while (n--){
		*s1++ = '\0';
	}
	
	return tmp;

}
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值