赞
踩
strlen用于计算字符串的长度,strrlen的返回值类型是size_t,strlen的参数是一个字符指针,因为只会进行计算长度,不会对字符串进行更改,所以可以使用const,防止对str字符串进行修改,strlen会计算从字符指针指向的字符一直到 ‘\0’ ,总共有多少个字符,不包括 ‘\0’。
在strlen的使用中需要注意的是保证需要计算的字符串中必须有 ‘\0’,如果没有’\0’,strlen的结果就会是随机数。
#include <stdio.h>
#include <string.h>
int main()
{
char arr[] = "abcdef";
printf("%zd\n", strlen(arr));
printf("%zd\n", sizeof(arr))
char ch[] = {
'a', 'b'};
printf("%zd\n",strlen(ch));
return 0;
}
arr[i] | i | ch[i] |
---|---|---|
a | 0 | a |
b | 1 | b |
c | 2 | |
d | 3 | |
e | 4 | |
f | 5 | |
\0 | 6 |
对数组arr来说,字符’a’,‘b’,‘c’,‘d’,‘e’,‘f’,'\0’都属于字符串“abcdef”在内存中存放的一部分,所以sizeof(arr)的结果是7,因为strlen只计算 ‘\0’ 之前的长度,所以strlen(arr)的结果是6。同理,可以计算得到 sizeof(ch) 的结果是2,因为strlen计算的是 ‘\0’ 之前的所有字符,而在ch中没有‘\0’,ch只有两个字符,我们无法得知‘\0’的位置,所以strlen(ch)的结果是随机的。
运行结果
第一种方式(循环)
int my_strlen1(const char* str)
{
assert(str);
int count = 0;
while (*str)
{
str++;
count++;
}
return count;
}
在my_strlen1中先定义一个int类型的计数变量,当 *str != ‘\0’ 时,str++,count++, str指向下一个字符,当 *str == ‘\0’ 时,循环结束,返回count,此时的count就是字符串的长度。
第二种方式(递归)
int my_strlen2(const char* str)
{
int count = 0;
if(*str)
{
return my_strlen2(str+1)+1;
}
return count;
}
my_strlen2函数使用的是递归的方式,先定义一个int类型的计数变量,当 *str != ‘\0’ 时,return my_strlen2(str+1) + 1,也就是对str+1所指向的字符进行计算并且 + 1,只要不为 ‘\0’ ,递归就能继续,返回值就+1,当 *str == ‘\0’ 时,return此时的count,递归结束。
第三种方式(指针 - 指针)
int my_strlen3(const char* str)
{
char* s = str;
while(*str)
{
str++;
}
return str - s;
}
my_strlen3首先使用 char* 类型的变量 s 来标记起始指针的位置,然后让 str 在 *str != ‘\0’ 时,一直向后移动,当 *str == ‘\0’ 的时候,循环结束,此时,str指向 ‘\0’ ,而s 指向字符串的起始地址,返回 str - s的值,也就得到了 ‘\0’ 前面的字符个数。
#include <stdio.h> #include <string.h> int my_strlen1(const char*); int my_strlen2(const char*); int my_strlen3(const char*); int main() { char arr[] = "abcdef"; printf("%zd\n", strlen(arr)); printf("%zd\n", my_strlen1(arr)); printf("%zd\n", my_strlen2(arr)); printf("%zd\n", my_strlen3(arr)); char ch[] = { 'a', 'b'}; printf("%zd\n",strlen(ch)); printf("%zd\n",my_strlen1(ch)); printf("%zd\n",my_strlen2(ch)); printf("%zd\n",my_strlen3(ch)); return 0; }
代码运行结果
strcpy用于拷贝字符串,也就是将source字符串拷贝到字符串destination,前提是destination字符串的长度不小于source字符串,拷贝的方式是直接从 destination指向的位置开始覆盖,在使用的时候可以通过更改destination的值来进行从不同位置的拷贝,strcpy拷贝的字符包括最后的 ‘\0’ ,返回值的类型是char*,返回的是传入strcpy的destination,因为destination字符串需要进行更改,所以不能在destination的前面加上const进行限定,因为source字符串不需要进行更改,所以source字符串可以加上const进行限定。
strncpy与strcpy十分相似,只是多了一个数字num来控制拷贝的字符个数。如果num大于字符串的长度,该函数会自动添加 ‘\0’ ,如果num小于字符串的长度,并不会在最后添加’\0’,只会拷贝相应数字的字符。
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = "abcd";
char arr2[10] = "xxxxxxxxx";//10个元素包括了末尾的'\0',所以最多只有9个x
strcpy(arr2, arr1);
strncpy(arr2, "456", 2);
strncpy(arr2, "12", 5);
return 0;
}
调试图
char arr2[10] = "xxxxxxxxx";
初始化arr2时的每个元素。
strcpy(arr2, arr1);
将arr1中的每个元素都拷贝到arr2中,可以看到图中红色的都是arr2中的元素变化。
strncpy(arr2, "456", 2);
将字符串"456"中的前两个字符拷贝到arr2中,可以看到arr2中的字符串变化,只改变了前两个字符,并没有添加’\0’。
strncpy(arr2, "12", 5);
当数字大于字符串的字符个数时,strncpy()会直接在后面加上’\0’,如下图所示,显示发生变化的字符只有四个,这是因为之前就已经将 arr[4] 改为了’\0’。
char* my_strcpy(char* dest, const char* src)
{
char* ret = dest;
while (*dest++ = *src++)
{
;
}
return ret;
}
先定义一个char*类型的变量来存放dest的起始地址,再用while循环来对dest对应的字符进行赋值,将dest对应的字符赋值成src,然后指针 dest 和 src 都向后移动,然后再赋值,直到 src 到字符串的末尾,也就是 src 变为 ‘\0’,然后将 * dest 赋值成 ‘\0’ ,此时,因为dest='\0’表达式的结果为假,所以循环条件不再成立,循环结束
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。