|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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,终于结束了,受益匪浅,感谢小甲鱼论坛!!!!
另外,补上楼主给我的解释:
|
评分
-
查看全部评分
|