- 一、strlen
- 二、strcpy
- 三、strncpy
一、strlen
太简单都懒得介绍了,还是介绍一下吧
功能:用来返回字符串的长度
直接上内核源码:
size_t strlen(const char *s)
{
const char *sc;
for (sc = s; *sc != ' '; ++sc)
;
return sc - s;
}
关于 *sc != ' ',大家应该都知道字符串的结尾是结束符— 而不是最后一个字符,所以遇到结束符时表示到最后了
使用示例及结果:
#include#include void main(){ char *a = "Ac"; char b = "Ac"; printf("strlen(a) = %dn", strlen(a)); printf("sizeof(a) = %dn", sizeof(a)); //printf("strlen(b) = %dn", strlen(b));这个语句不能使用,因为strlen()的参数是const char *s,b只是个char型变量 printf("sizeof(b) = %dn", sizeof(b)); }
顺便说一下sizeof(),sizeof是用来求变量大小的,上面代码中
变量b是char类型,char是1字节,结果就是1
a是char*类型的指针,指针一般都是4字节,所以结果是4
而a的长度,就是字符串的长度,两个字符就是2啦
当然也可以sizeof(int),sizeof(char)等等。
对比代码及结果:
#include#include void main(){ int a[3] = {1,2,3}; char b[] = "Ac"; printf("strlen(a) = %dn", strlen(a)); printf("strlen(a) = %dn", strlen(a[3])); printf("sizeof(a) = %dn", sizeof(a)); printf("strlen(b) = %dn", strlen(b)); printf("sizeof(b) = %dn", sizeof(b)); }
有没有感到迷惑,当时我可是懵了的,整好久才明白
strlen(a):a是int型数组名,此处直接使用表示的时a[1],长度当然是1
strlen(a[3]):a[3]就是3个元素呗,长度是3
sizeof(a):a的大小,这里就是整形数组的大小,3个int型变量,就是3*4=12
strlen(b):b的长度,A和c,长度可不就是2
sizeof(b):b的大小,前面说了字符串结尾还有一个结束符 ,所以就是2+1=3
二、strcpy源码如下:
#undef strcpy
char *strcpy(char *dest, const char *src)
{
char *tmp = dest;
while ((*dest++ = *src++) != ' ')
;
return tmp;
}
作用:将src中的内容复制到dest中
使用示例及结果:
#include#include int main() { char src[40] = {0}; char dest[100] = {0}; strcpy(src, "ABCDEFG"); strcpy(dest, src); printf("dest: %sn", dest); return(0); }
使用这个函数要注意,src<=dest,这是防止内存践踏,如果src大于dest,dest空间就放不下,多出的内容就要紧挨着dest放,如果这块空间有其他变量在使用,那么它就意外的被改变了。
看看该函数的描述
DESCRIPTION
The strcpy() function copies the string pointed to by src, including the terminating
null byte (' '), to the buffer pointed to by dest. The strings may not overlap,
and the destination string dest must be large enough to receive the copy. Beware of
buffer overruns! (See BUGS.)
三、strncpy
strncpy和strcpy是兄弟俩,源码中strncpy定义如下
char *strncpy(char *dest, const char *src, size_t count)
{
char *tmp = dest;
while (count) {
if ((*tmp = *src) != 0)
src++;
tmp++;
count--;
}
return dest;
}
man手册中的说明
The strncpy() function is similar, except that at most n bytes of src are copied.
Warning: If there is no null byte among the first n bytes of src, the string placed
in dest will not be null-terminated.
If the length of src is less than n, strncpy() writes additional null bytes to dest
to ensure that a total of n bytes are written.
1、strncpy拷贝src的前count个字节到dest中
2、当count大于src时,为了凑够count个数,会补上空值,即NULL。
3、当count小于src时,会拷贝count个值到dest中,但是dest没有结束符,srncpy不会自动给dest添加结束符
注意:当数组未初始化时,如char dest[];使用strncpy前要做这一步dest[count] = ' ';否则dest会乱码,如果数组初始化了char dest[10] = {0};则无需做这一步
使用示例及结果:数组初始化
#include#include int main() { char src[] = {"ABCDE"}; char dest[10] = {0}; strncpy(dest,src,8); printf("dest: %sn", dest); printf("strlen(dest): %dn", strlen(dest)); return 0; }
这里拷贝count为8,src长度小于count
dest: ABCDE strlen(dest): 5
当修改为strncpy(dest,src,3);
dest: ABC strlen(dest): 3
使用示例及结果:数组未初始化
#include#include int main() { char src[] = {"ABCDE"}; char dest[10]; //dest[3] = ' '; strncpy(dest,src,3); printf("dest: %sn", dest); printf("strlen(dest): %dn", strlen(dest)); return 0; }
dest: ABC烫烫烫烫藺BCDE strlen(dest): 17
总结:
1、strcpy使用时切勿使src>dest,防止内存越界,strcpy不需要设置’ ’哦
2、strncpy使用时,除了防止越界还有以下小技巧
a)数组初始化时,尽量使用strncpy(dest,src,sizeof(dest)-1);最多也就拷贝dest-1长度,问为什么要减1,因为字符串要以结束符’ ’结束啊,实际上char dest[10]也就只有9个有效长度的字符
b)数组未初始化时,提前把结束符放好dest[count] = ' ';
本人新手一只,如有错误欢迎指出!



