字符函数与字符串函数(1),2024年最新大数据开发工程师的面试题

注意这里必须是高地址减低地址,不然就是负数了。

四.strcpy函数

函数介绍

strcpy是用于字符串拷贝的,第一个参数destination是目的地的地址,而第二个参数是源头的地址。

#include<stdio.h>
#include<string.h>
int main()
{
char dest[10] = “abc”;
char* source = “abcdef”;
strcpy(dest,source);
printf(“%s”,dest);
return 0;
}

这样我们就把source所指向的字符串成功复制到了dest字符数组中。

注意事项:

  1. 字符串在拷贝的过程中是包含字符’\0’的,而且会在这个字符停止拷贝。也就是所源字符串必须以’\0’结尾。
  2. 为了避免溢出,目标空间必须足够大,要确保能完整存放源字符串。
  3. 目标空间必须能够修改。
  4. 目标空间在内存上不能与源字符串相互重叠。

返回值是目标空间的地址。

strcmp的模拟实现

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

char* my_strcpy(char* destination,const char* source)
{
char* ret = destination;
while (*source)
{
*destination++ = *source++;
}
*destination = source;//最后将’\0’复制
return ret;
}
int main()
{
char dest[10] = “abcxxxxxxx”;
char
source = “abcdef”;
my_strcpy(dest,source);
printf(“%s”,dest);
return 0;
}

简化一下:

char* my_strcpy(char* destination, const char* source)
{
char* ret = destination;
while (*destination++ = *source++)
{
;
}
return ret;
}

五.strcat函数

函数介绍

strcat这个函数是用于字符串附加的,将source所指向的字符串附加到destination的末尾。

int main()
{
char dest[20] = “hello “;
char* source = “world!”;
strcat(dest,source);
printf(”%s”,dest);
return 0;
}

也就是将source的字符串链接在dest的后面。我们知道字符串的末尾是有一个隐藏的’\0’的,但是这里还是打印出了world!,说明在使用strcat进行附加的时候,末尾的’\0’是已经被覆盖了的。

注意事项:

  1. destination所指向的字符串最后的’\0’字符被source所指向的字符串的第一个字符覆盖了。
  2. 这个新的字符串末尾是含有’\0’的。
  3. 目标空间必须足够大,要能容纳新的字符串。
  4. destination和source所指向的空间在内存上不能重叠,否则运行结果是未知的。

返回值的是destination的起始地址。

strcat的模拟实现

首先我们需要先找到目标字符末尾的’\0’字符,然后进行拷贝。

#include<stdio.h>
#include<string.h>
char* my_strcat(char* destination,const char* source)
{
char* ret = destination;
while (*destination)
destination++;
while (*destination++ = source++);
return ret;
}
int main()
{
char dest[20] = "hello ";
char
source = “world!”;
my_strcat(dest,source);
printf(“%s”,dest);
return 0;
}

六.strcmp函数

参考网址:strcmp - C++ Referenceicon-default.png?t=N7T8https://legacy.cplusplus.com/reference/cstring/strcmp/?kw=strcmp

函数介绍

int strcmp(const char* str1, const char* str2);

This function starts comparing the first character of each string. If they are equal to each other, it continues with the following pairs until the characters differ or until a terminating null-character is reached.This function performs a binary comparison of the characters.

这个函数是用于比较两个字符串的。这个函数首先会比较两个字符串的首字符,如果相同,这个函数就会继续比较下一对字符,直到遇到不同的字符或者’\0’.这个函数的执行的是二进制的比较。

返回值

情况1:

“abc”//str1
“abf”//str2

这两个字符串的前两个字符相同,而第三个字符不同,c的ASCII值小于f的ASCII值。所以strcmp会返回一个小于0的整形。

情况2:

“abc”//str1
“abc”//str2

这两个字符串一模一样,这样就会strcmp就会返回一个0。

情况3:

“abc”//str1
“abb”//str2

这两个字符串的前两个字符相同,而第三个字符不同,c的ASCII值大于b的ASCII值。所以strcmp会返回一个大于0的整形。

情况4:

“abc”//str1
“aaz”//str2

这两个字符串的第一个字符相同,而第二个字符str1大于str2,这时候返回一个大于0的整形。第三个字符就不会进行比较了。

strcmp函数的模仿实现

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<assert.h>
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 && str2);
int ret = 0;
while (*str1 == *str2)
{
if (*str1 == ‘\0’)
{
return 0;
}
str1++;
str2++;
}
return str1 - str2;
}
int main()
{
char
str1 = “abc”;
char
str2 = “aaz”;
printf(“%d”,my_strcmp(str1,str2));
return 0;
}

七.strncpy,strncat,strncmp函数

这三个函数与上面所讲的三个函数非常的相似,从函数民上我们发现只多了一个n字母。

那么实际上他们有什么区别呢?

char* strncpy(char* destination, const char* source, size_t num);
char* strncat(char* destination, const char* source, size_t num);
int strncmp(const char* str1, const char* str2, size_t num);

从他们的参数上来看,我们发现只多了一个size_t类型的参数num,也就是函数名中多的n。

那么这个num到底有什么用呢?

(1)strncpy

对于strncpy来说,这个num就是用于指定字数的字符串拷贝。

int main()
{
char dest[20] = “xxxxxxxxxxhello “;
char* source = “world!”;
strncpy(dest,source,5);
printf(”%s”,dest);
return 0;
}

打印结果:

仔细观察发现source中的感叹号并没有复制到dest字符中。也就是只复制了source的前五个字符。所以这个num就是给我们来控制想复制的字符个数的。

如果num的值大于source所指向的字符串的长度 。会在拷贝完字符串后,在’\0’的后面一直追加0,直到满足num个字符。

模拟实现

#include<stdio.h>
char* my_strncpy(char* destination, const char* source, size_t num)
{
char* ret = destination;
for (int i = num; i > 0; i–)
{
if (*source) {
*destination = *source;
}
else {
destination = ‘\0’;
}
destination++;
source++;
}
return ret;
}
int main()
{
char str1[20] = “xxxxx world!!!”;
char
str2 = “hello”;
printf(“%s\n”, str1);
my_strncpy(str1,str2,7);
printf(“%s”,str1);
return 0;
}

(2)strncat

这个函数同理,num也是用于控制附加的个数的。

int main()
{
char dest[20] = “hello “;
char* source = “world!”;
strncat(dest,source,5);
printf(”%s”,dest);
return 0;
}

虽然我们只附加了五个字符,这个是并没有包含’\0’的,所以这个函数会自动在新字符串的末尾补上斜杠零。

strcat的模拟实现

char* my_strncat(char* destination, const char* source, size_t num)
{
char* ret = destination;
while (*destination)
{
destination++;
}

for (int i = 0; i < num; i++)
{
if (*source) {
*destination = *source;
}
else{
destination = ‘\0’;
}
destination++;
source++;
}
return ret;
}
int main()
{
char str1[20] = "hello ";
char
str2 = “world!!!”;
printf(“%s\n”, str1);
my_strncat(str1, str2, 7);
printf(“%s”, str1);
return 0;
}

(3)strncmp函数

这个函数也是,num控制比较的个数。只比较前num个字符,其他均与strcmp一样

注意事项

这六个函数的目标字符串和源字符串都不能在内存上有任何重叠,不然运行结果是未知的,可能复合要求,也可能不符合,这与编译器有关。

八.strstr函数

函数的介绍

参考网址:strstr - C++ Reference

char * strstr (const char * str1, const char * str2 );

这个函数是用于在一个字符串中查找是否具有另一个字符串。

返回值

这个函数的返回值是str1中具有str2字符串的首字符的地址。

比如:“abcdef"和"cdef”.返回值就是“abcdef”中字符C的地址。

如果没有找到,就会返回NULL.

strstr函数的模拟实现

#include<stdio.h>
#include<string.h>
char* my_strstr(const char str1,const charstr2)
{
if (!str2)
return (char
)str1;
char* s1 = NULL;
char* s2 = NULL;
char* cur = (char*)str1;
while (cur)
{
s1 = cur;
s2 = (char
)str2;
while (*s1 == *s2 && *s1 && s2)
{
s1++;
s2++;
}
if (!s2)
return cur;
cur++;
}
return NULL;
}
int main()
{
char
str1 = “this is a string”;
char
str2 = “str”;
char * ret = my_strstr(str1,str2);

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数大数据工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上大数据开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)
img

技术停滞不前!**

因此收集整理了一份《2024年大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
[外链图片转存中…(img-zPk9aBqP-1712576417159)]
[外链图片转存中…(img-4sid3p0t-1712576417159)]
[外链图片转存中…(img-E5Eyx9kr-1712576417159)]
[外链图片转存中…(img-HtFd7xkN-1712576417160)]
[外链图片转存中…(img-qEjz0uEE-1712576417160)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上大数据开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)
[外链图片转存中…(img-7w3izucz-1712576417160)]

  • 21
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值