鱼C论坛

 找回密码
 立即注册
查看: 2366|回复: 0

[技术交流] S1E19字符串处理函数学习笔记

[复制链接]
发表于 2017-8-31 10:49:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
先讲的就是字符串的初始化方法,四种方法:


//初始化字符数组的每个元素

char str1[10] = { 'F', 'i', 's', 'h', 'C', '\0' };

//不写元素的个数,因为编译器会自动计算
char str3[] = { 'F', 'i', 's', 'h', 'C', '\0' };


//使用字符串常量初始化字符数组
char str4[] = { "FishC" };


//使用字符串常量,省略大括号
char str5[] = "FishC";



当然最后一种最好,简单,就用最后一个了


讲了一点,小甲鱼说:避免重复造轮子!的确,这是非常重要的!!!


C标准函数库地址:

http://bbs.fishc.com/forum.php?mod=viewthread&tid=70614&extra=page%3D1%26filter%3Dtypeid%26typeid%3D583


然后学习的第一个函数:

strlen  获取字符串的长度 ,这个例子比较重要,因为前几天一个逆向群的问题也是这样子,先贴上代码:


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




int main()
{
char str[] = "I love FishC.com!";


printf("sizeof str = %d\n", sizeof(str));
printf("strlen str = %u\n", strlen(str)); //strlen返回值是size_t  ==  unsigned int


/*

通过运行结果可知 :

strlen 长度 : 只是字符个数,不包含\0


sizeof 尺寸 : 尺寸,大小,包含\0


*/




return 0;
}


上图:


                               
登录/注册后可看大图





                               
登录/注册后可看大图




感觉是学到真东西了


接下来学习了strcpy函数:



                               
登录/注册后可看大图

运行结果发现str1 = str2

但是str1 本来是比 str2长的,为什么后面的没有显示呢

原来strcpy函数在复制的过程中,把字符串结尾的\0也复制了过去

编译器看到\0就认为字符串结束了,OK,就是这样子


测试了一下参数左边 > 右边,发现VS2013和linux确实不太一样:


                               
登录/注册后可看大图



虽然说也是弄过去了,但是报错了,也就是溢出了。


为了保证复制 过程中的安全,有了strncpy函数:


int main()
{
char str1[] = "To be or not to be";
char str2[40];




strncpy(str2, str1, 5);
str2[5] = '\0';


printf("str2 : %s\n", str2);










return 0;
}

这个函数有意思,为什么呢,因为在复制的时候不会自动在字符串末尾追加\0,

所以我们在最后的一个长度要
str2[5] = '\0';

如果不这样的话,我们试一下在VS2013下面:

  


                               
登录/注册后可看大图




哈哈哈,读到了乱七八糟的东西了。




接下来,又有新东西了,strcat函数:


int main()
{
char str1[] = "I love";
char str2[] = "baidu.com!";


strcat(str1, " ");
strcat(str1, str2);


printf("str1 : %s\n", str1);


return 0;
}


但是,照视频中这么做,竟然错了:


                               
登录/注册后可看大图


他们说:str1没有那么长,放不下那么多字符

我还不知道,论坛他们还没答复


上了个厕所,我试了一下:

int main()
{
char str1[18] = "I love";
char str2[] = "FishC.com!";


strcat(str1, " ");
strcat(str1, str2);


printf("str1 : %s\n", str1);


return 0;
}


主要改的地方:
char str1[18]

我设置了数组的长度,我猜测,是不是str[]="i love"导致编译器认为str数组的长度就是5?

也许吧,然后在追加的时候,就会直接溢出,无论strcat追加什么都是溢出的。


                               
登录/注册后可看大图



文档也贴上吧:


                               
登录/注册后可看大图


还有就是strncat函数,类似于strcpy,区别在于strcpy需要自己追加\0


int main()
{
char str1[18] = "I love";
char str2[] = "FishC.com!";


strcat(str1, " ");
strncat(str1, str2, 5);


printf("str1 : %s\n", str1);


return 0;
}


比如这样子,直接就输出
I love FishC


                               
登录/注册后可看大图



接下来就是字符串比较函数:

strcmp:



int main()
{
char str1[] = "FishC.com";
char str2[] = "FishC.com";


if (!strcmp(str1,str2))
{
printf("两个字符串完全一致!\n");
}
else
{
printf("两个字符串不完全一致!\n");
}






return 0;
}




                               
登录/注册后可看大图




如果字符串相等,strcmp函数返回值是0,否则返回非零,

贴上官方文档:



                               
登录/注册后可看大图



                               
登录/注册后可看大图



嗯,就是这样子


当然还有strncmp

作用是比较前n个字符,而不是第n个字符:


                               
登录/注册后可看大图





                               
登录/注册后可看大图



OK,终于结束了,受益匪浅,感谢小甲鱼论坛!!!!







另外,补上楼主给我的解释:


                               
登录/注册后可看大图







评分

参与人数 1鱼币 +3 收起 理由
小甲鱼 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 21:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表