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]