目录
字符串的多种形式
1.字符数组形式(不写元素个数)
char str1[] = {
'a','b','c' };
char str2[] = {
"abc" };
char str3[] = "abc";
可见在不写数组元素个数,只写[ ]时,str1不会在后面自动补充\0
在写成字符串时可自动补\0
2.字符数组形式(写元素个数)
char str1[3] = {
'a','b','c' };
char str2[4] = {
'a','b','c' };
char str3[3] = {
"abc" };
char str4[4] = {
"abc" };
char str5[3] = "abc";
char str6[4] = "abc";
可见在输入元素后大家表现的都非常一致,当元素仅仅够字符不够加上\0时都不会主动加\0,当有元素多出时会在字符串后面出现\0
但要注意,str2这种情况有\0是因为多出的元素默认为\0
str4和str6这种情况有\0是因为字符串末尾会自己追加\0
str3和str5之所以没有追加上\0是因为元素不足
3.字符指针(常量字符串)
char* str1 = "abc";
char* str2 = {
"abc" };
printf("%s\n", str1);
printf("%s\n", str2);
这个里用字符指针接收的都是常量字符串,在内存中你看不到到底后面是否有\0
所以利用%s遇到\0停止打印这一特性,会发现str1和str2都可以正常打印创建的常量字符串,所以常量字符串后面会自动追加\0
总结
输入“abc”这种字符串时,只要开辟的空间够多就可以自动追加\0,如果不够也就是少了\0的空间,那就无法追加\0
“abc”和{“abc”}的情况相同
{ ‘a’,‘b’,‘c’ }这种情况不论什么时候都不会自动追加\0
在开辟字符串时多出的内存会默认变为\0
1.求字符串长度函数strlen( )
size_t strlen ( const char * str );
功能:记录字符串\0前有多少个字符
1.字符串已经 '\0’作为结束标志,strlen函数返回的是在字符串中 '\0’前面出现的字符个数(不包含 ‘\0’)
2.参数指向的字符串必须要以 '\0’结束
只所以len1是15是因为str1中没有\0,strlen在str1中一直没找到\0,终于在第15个字符后找到了,所以记录15,实则是随机值,而str2中有\0,所以返回3也就是记录了3个字符
3.注意函数的返回值为size_t是无符号的
strlen(“abc”)应该是3而strlen(“qwerty”)应该是6,结果输出的是>,这时为什么呢,是因为strlen返回的是一个size_t的无符号整形,3-7虽然是-4但是size_t会认为它是一个很大的正数,所以输出的>而不是<=
修改:
strlen函数的模拟实现
计数器方法
size_t my_strlen(const char* str)
{
assert(str);
int count = 0;
while (*str++ != '\0')
{
count++;
}
return count;
}
递归方法
size_t my_strlen(const char* str)
{
if (*str == '\0')
{
return 0;
}
else
{
return