栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言-str家族之strlen,strcpy,strncpy

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言-str家族之strlen,strcpy,strncpy

文章目录
  • 一、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] = '';

本人新手一只,如有错误欢迎指出!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1010199.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号