C语言中字符串处理函数详解

1.C语言的字符串

首先C语言中并没有字符串这个基础数据类型。但是字符串在c语言中的涉及却是十分的广泛,并且也是十分重要的。

定义:

由双引号" "引起来的内存中的一串字符且以’\0’为结束标志符 的字符。

字符串的操作

1.size_t strlen(const char *s);

2.char *strcpy(char *dest,const char * src);

3.char *strncpy(char *dest,const char *src,size_t n);

4.char *strcat(char *dest,const char *src);

5.char *strncat(char *dest,const char *src,size_t n);

6.int strcmp(const char *s1,const char *s2);

7.int strncmp(const char *s1,const char *s2,size_t n);

8. int atoi(const char *nptr);

处理函数详解

1.size_t strlen(const char *s)

功能

从字符串的内存首地址开始直到第一个’\0’结束统计字符的个数(不包括’\0’).

strlen()和sizeof的区别

首先sizeof是求得变量、数组、指针、数据所占内存的字节数量,它是一个运算符不是函数,而strlen()是求字符串长度,即字符个数,它是c语言标准函数。如果想详细了解sizeof,可以看我前面所发的博客。

代码实现

size_t strlen(const char *s){
	assert(s != NULL);	//断言函数,断言传进来的地址不为空
	size_t cnt=0;
	while(*s++ != '\0'){
		cnt++;
	}
	return cnt;
}

2.char *strcpy(char *dest,const char * src)

功能

把src所指的内容拷贝到*dest中,字符串结束标志’\0’也一起拷贝(如果dest的字符串比src的长并不完全覆盖dest的内容);

代码实现

char *strcpy(char *dest,const char *src){
	assert(dest!=NULL && src !=NULL);
	int i = 0;
	for(i=0;src[i] != '\0';i++){
		dest[i] = src[i];
	}
	dest[i] = '\0';
	return dest;
}

或者

char *strcpy(char *dest,const char *src){
	assert(dest!=NULL&&src !=NULL);
	char *pdest = dest;
	while(*dest++ = *src++ != '\0');
	return pdest;
}

3.char *strncpy(char *dest,const char *src,size_t n)

功能

把src的前n个字符拷贝到dest中(包括结束标志位’\0’),字符串不能重叠,目标字符串dest必须足够大以接收副本。

代码实现

char *strncpy(char *dest,const char *src,size_t n){
	assert(dest!=NULL&&src!=NULL);
	size_t i = 0;
	for(;i<n;i++){
		dest[i] = src[i];
		if(src[i] = '\0'){
			break;
		}
	}
	return dest;
}

或者

char *strncpy(char *dest,const char *src,size_t n){
	assert(dest!=NULL&&src!=NULL);
	char *pdest = dest;
	while(n-->0&&(*dest++=*src++)!='\0');
	return pdest;
}

4.char *strcat(char *dest,const char *src)

功能

strcat()函数实现把字符串src追加到dest字符串,覆盖dest字符串最后的结束标志位‘\0’,在最终的字符串最后加上结束标志位’\0’;字符串不能重叠,目标字符串dest必须足够大以接收副本。

代码实现

char *strcat(char *dest,const char *src){
	assert(dest!=NULL&&src!=NULL);
	size_t i;
	size_t len = strlen(dest);
	for(i=0;src[i]!='\0';i++){
		dest[len+i] = src[i];
	}
	dest[len+i] = '\0';
	return dest;
}

或者

char *strcat(char *dest,const char *src){
	assert(dest!=NULL&&src!=NULL);
	char *pdest = dest;
	while(*dest != '\0'){
		dest++;
	}
	while(*dest++ = *src++ != '\0');
	return pdest;
}

5.char *strncat(char *dest,const char *src,size_t n)

功能

strncat()函数实现把字符串src的前n个字符追加到dest字符串,覆盖dest字符串最后的结束标志位‘\0’,在最终的字符串最后加上结束标志位’\0’;字符串不能重叠,目标字符串dest必须足够大以接收副本。

代码实现

char *strncat(char *dest,const char *src,size_t n){
	assert(dest != NULL && src != NULL);
	size_t len = strlen(dest);
	size_t i;
	for(i=0;i<n && src[i] != '\0';i++){
		dest[len+i] = src[i];
	}
	dest[len+i] = '\0';
	return dest;
}

或者

char *strncat(char *dest,const char *src,size_t n){
	assert(dest !=NULL&&src!=NULL);
	char *pdest = dest;
	while(*dest != '\0'){
			dest++;
	}
	while(n-->0&&(*dest++ = *src++)!= '\0');
	*dest = '\0';
	returm pdest;
}

6.int strcmp(const char *s1,const char *s2)

功能

strcmp()函数比较两个字符串s1和s2的大小,返回 >0(s1>s2)或者=0(s1==s2)或者<0(s1<s2)的整数;

代码实现

int strcmp(const char *s1,const char *s2){
	assert(s1!=NULL&&s2!=NULL);
	while(*s1 != '\0'&&*s2 != '\0'&&*s1 == *s2){
		++s1;
		++s2;
	}
	return *s1-*s2;
}

7.int strncmp(const char *s1,const char *s2,size_t n)

功能

strncmp()的功能strcmp()大致相同,只不过strncmp()只比较前n个字符的大小;

代码实现

int strncmp(const char *s1,const char *s2,size_t n){
	assert(s1!=NULL&&s2!=NULL);
	while(n>0 && *s1!='\0' && *s2!='\0' && *s1==*s2){
		s1++;
		s2++;
		n--;
	}
	return *s1-*s2;
}

8. int atoi(const char *nptr)

功能

输入一串字符串转换为整数并输出。

代码实现

int atoi(const char *nptr){
	assert(nptr!=NULL);
	int flag = 1 //判断是否为负数
	if(*nptr ==' -'){
		flag = -1;
		nptr++;
	}else if(*nptr == '+'){
		flag = 1;
		nptr++;
	}
	int num = 0;
	while(*nptr!='\0'){
		num = num*10+(*nptr-'0');
		nptr++;
	}
	return num*flag;
}
发布了14 篇原创文章 · 获赞 84 · 访问量 2799

猜你喜欢

转载自blog.csdn.net/weixin_42617375/article/details/103095121