小迪 发表于 2017-8-31 10:49:52

S1E19字符串处理函数学习笔记

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


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

char str1 = { '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;
}


上图:

http://a3.qpic.cn/psb?/V142tIWA265iLX/IcsxCE.C*aLW.2ZhDNRHPPguxjSlG3g5nXmdq9x0j.c!/b/dB4BAAAAAAAA&ek=1&kp=1&pt=0&bo=gwM.AoMDPgIDIAU!&su=0172628545&tm=1504144800&sce=0-12-12&rf=2-9



http://a2.qpic.cn/psb?/V142tIWA265iLX/ru1ZVqBO.mOvuB7NW2E.lnDwkqbehRljgcRq6NW0eE4!/b/dHUAAAAAAAAA&ek=1&kp=1&pt=0&bo=xwR*AscEfwIDEDU!&su=0164863329&tm=1504144800&sce=0-12-12&rf=2-9



感觉是学到真东西了


接下来学习了strcpy函数:


http://a4.qpic.cn/psb?/V142tIWA265iLX/5Q1JsSAglnK0j4dtYbmy3lRv2AxZKMLvBk5LpMKLcyE!/b/dPcAAAAAAAAA&ek=1&kp=1&pt=0&bo=2QOyAdkDsgEDEDU!&su=0107694977&tm=1504144800&sce=0-12-12&rf=2-9
运行结果发现str1 = str2

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

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

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


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

http://a3.qpic.cn/psb?/V142tIWA265iLX/JQFSdbgBDKxthUDn*JfuZGsELFmaqqihC5ziFED8e40!/b/dEIAAAAAAAAA&ek=1&kp=1&pt=0&bo=MwQyAjMEMgIDIAU!&su=094557713&tm=1504144800&sce=0-12-12&rf=2-9


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


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


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




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


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










return 0;
}

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

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

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


http://a2.qpic.cn/psb?/V142tIWA265iLX/dQj7pXyZy711CCH78*xW92k*nTObv.zVdF4j.U0qgzs!/b/dPkAAAAAAAAA&ek=1&kp=1&pt=0&bo=DwS1AQ8EtQEDEDU!&su=058637569&tm=1504144800&sce=0-12-12&rf=2-9



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




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


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


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


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


return 0;
}


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

http://a2.qpic.cn/psb?/V142tIWA265iLX/vr6bHd33co*.oA82jzgOtbafE69ClQJvQTn.4lJ0nBE!/b/dAEBAAAAAAAA&ek=1&kp=1&pt=0&bo=wgM7AsIDOwIDEDU!&su=0236294193&tm=1504144800&sce=0-12-12&rf=2-9

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

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


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

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


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


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


return 0;
}


主要改的地方:char str1

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

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

http://a3.qpic.cn/psb?/V142tIWA265iLX/bDH2m7XHS*x8PlhWRMy73Yl9shrTCLgtdVbmiBo3vXQ!/b/dB4BAAAAAAAA&ek=1&kp=1&pt=0&bo=8wJuAfMCbgEDEDU!&su=0235701185&tm=1504144800&sce=0-12-12&rf=2-9


文档也贴上吧:

http://a1.qpic.cn/psb?/V142tIWA265iLX/WNUNLBFnJKQLqTXFTEX.CHF3JiYHwwpDjyxjwB.KbzE!/b/dBgBAAAAAAAA&ek=1&kp=1&pt=0&bo=AgRAAgIEQAIDEDU!&su=0121037137&tm=1504144800&sce=0-12-12&rf=2-9

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


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


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


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


return 0;
}


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

http://a2.qpic.cn/psb?/V142tIWA265iLX/VHMewV6G28abgzos1OORb6LcQGutXBQpVJr830rswnA!/b/dPkAAAAAAAAA&ek=1&kp=1&pt=0&bo=OgOIAToDiAEDEDU!&su=0136960833&tm=1504144800&sce=0-12-12&rf=2-9


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

strcmp:



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


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






return 0;
}



http://a4.qpic.cn/psb?/V142tIWA265iLX/wOPPav0ydxsftKRJOZDwiuNfP2.wlYENlJz0qRN473I!/b/dBsBAAAAAAAA&ek=1&kp=1&pt=0&bo=JgO2ASYDtgEDEDU!&su=0157466193&tm=1504144800&sce=0-12-12&rf=2-9



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

贴上官方文档:


http://a2.qpic.cn/psb?/V142tIWA265iLX/7wmkykKfVA*68eVQM.ZiMvi4Q1jhbXkBhWaBfVTQga0!/b/dPkAAAAAAAAA&ek=1&kp=1&pt=0&bo=NgOAAhUELgMDEL4!&su=0133927729&tm=1504144800&sce=0-12-12&rf=2-9

http://a3.qpic.cn/psb?/V142tIWA265iLX/Qc4fj4APycIN08bVuNE3iVuYFdXCMGVH6AlBpzThCRA!/b/dEIAAAAAAAAA&ek=1&kp=1&pt=0&bo=FAMaARQDGgEDEDU!&su=014280129&tm=1504144800&sce=0-12-12&rf=2-9


嗯,就是这样子


当然还有strncmp

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

http://a4.qpic.cn/psb?/V142tIWA265iLX/Kyfxg4ibgx*rijVc6dyDLh2ms7FecK2pJxZKxYITOzY!/b/dLMAAAAAAAAA&ek=1&kp=1&pt=0&bo=VAPCAVQDwgEDEDU!&su=0174464673&tm=1504144800&sce=0-12-12&rf=2-9



http://a2.qpic.cn/psb?/V142tIWA265iLX/WbgMc*vIoGV8nn8bYqhn0Lgtf8NLBrCFUKdmyOBCfjQ!/b/dPkAAAAAAAAA&ek=1&kp=1&pt=0&bo=QAPfAUAD3wEDEDU!&su=091845601&tm=1504144800&sce=0-12-12&rf=2-9


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






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

http://a2.qpic.cn/psb?/V142tIWA265iLX/X2tW3gH45.tCJga2bjlVmDhpCxbnD07L1KcpwwQsa*A!/b/dPkAAAAAAAAA&ek=1&kp=1&pt=0&bo=CQSAAu0EDQMDIG0!&su=0160810401&tm=1504144800&sce=0-12-12&rf=2-9






页: [1]
查看完整版本: S1E19字符串处理函数学习笔记