字符串复制函数

举报
吴梦青 发表于 2022/06/11 20:09:39 2022/06/11
【摘要】 字符串复制函数,自定义字符串复制函数,在字符串里找字符。

1. strcpy

  • char * strcpy(char * restrict dst,const char * restrict src);
  • 把src的字符串拷贝到dst
    • restrict表明src和dst不重叠(C99)
  • 返回dst
    • 为了能链起代码来
    • 为了让函数strcpy能直接参与运算,所以函数strcpy的返回值是char * 的dst

2. 复制一个字符串

  • char * dst =(char*)malloc(strlen(src)+1)
  • strcpy(dst,src);
    • 不知道这个东西需要多少内存,所以需要动态规划一个内存
    • 这个长度strlen(src)是存内容的长度,不包括结尾“\0”,所以需要+1
    • 返回值类型是(void * ),转换为(char * )
    • 初学者经常犯的错误就是忘了+1。

3. 自己写一个strcpy函数相同功能的函数

#include <stdio.h>
#include <string.h>
char *mycpy(char *dst, const char *src) {
//	int idx = 0;
//	while(src[]!='\0') {
//		dst[idx]=src[idx];
//		idx++;
//	}
//	dst[idx]='\0';
	char *ret = dst;
	while (*dst++ = *src++);
	*dst = '\0';
	return ret;
}
int main(int argc, char const *argv[]) {
	char s1[] = "abc";
	char s2[] = "abc";
	printf("%c", s1);
	printf("%c", s2);
	printf("%d", strcpy(s1, s2));
	return 0;
}

4. 字符串中找字符

  • char * strchr(const char * s,int c);
    • 从左边找在s字符串里c第一次出现的位置
  • char * strrchr(const char * s,int c);
    • 从右边找在s字符串里c第一次出现的位置
  • 返回NULL表示没有找到
  • 返回非NULL表示找到了,指针指向要找的字符
  • 问题:如何寻找字符第2次出现的位置
#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[]) {
	char s[] = "hello";
	char *p = strchr(s, 'l');
	p = strchr(p + 1, 'l');
	printf("%s\n", p);
	return 0;
}

这个代码写的是,在s这个字符串里找‘l’,找到后把这个指针赋值给p,也就是说可以通过p访问找到的l的位置。所以p第一次输出的就是‘llo’,如果我们想找到第二个l,就可以在p这个字符串里,开始strchr,但是p里面的第一个字母也是l,所以我们就可以让p+1,这样就可以找出来第二个l了。\

5. 找到这个字符,把字符及其后面的字符复制到另外一个变量里去。

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

int main(int argc, char const *argv[]) {
	char s[] = "hello";
	char *p = strchr(s, 'l');
	char *t = (char *)malloc(strlen((p)+ 1);
	strcpy(t, p);
	printf("%s\n", p);
	printf("%s\n", t);
	free(t);
	return 0;
}

这个程序说的是,我们先定义一个t,然后动态规划一下他的大小,因为这个t是用来复制p的字符串的,所以需要p的字符串长度,(为什么strlen后还需要+1呢?)然后再用string.h里的字符串赋值函数把p的内容复制在t里。最后不要忘记了释放t。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。