字符串处理函数

举报
holo.yh 发表于 2021/07/31 23:02:09 2021/07/31
【摘要】 四个函数里面都是放字符串的。1.1strcpy函数 string copy调用格式:strcpy(左串,右串) 作用:将右边字符串(字符串常量或字符数组名)复制给左边字符串(字符数组名)返回值:赋值后的左串的首地址 。注意:(1)左串必须是字符数组名,右串可以是字符数组名或字符串常量。(2)左串必须有足够的空间,能容纳右串。(左串 ≥ 右串的有效长度)(3)复制时遇到右串中的' \0 ','...

四个函数里面都是放字符串的。

1.1strcpy函数 string copy

调用格式:

strcpy(左串,右串)

作用:

将右边字符串(字符串常量或字符数组名)复制给左边字符串(字符数组名)

返回值:

赋值后的左串的首地址 。

注意:

(1)左串必须是字符数组名,右串可以是字符数组名或字符串常量。

(2)左串必须有足够的空间,能容纳右串。(左串 ≥ 右串的有效长度)

(3)复制时遇到右串中的' \0 ','\0及后续的字符就不复制了'。

实例:


//字符串处理函数 - strcpy函数 
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
{
	char str1[] = "abcde"; //等价于char str1[6] = {"abcde"};或char str1[] = "abcde"; 
	//如果[]里不写,默认字节数为6 ,并且字节数不会随着下面的复制操作改变。 
	char str2[] = "abc";	
	
	/*  strcpy(左串,右串)
	 *  作用:把右串全部字符(包括\0)赋值给左串
	 *	返回值:赋值后左串的首地址 
	 *	原理:此函数能把整个str2复制到str1的原理是str2末尾有\0,当复制的过程中遇到\0会终止复制。 (猜测) 
	 */

	//1.右串可以是字符数组名,也可以是字符串常量
	printf("%s\n",strcpy(str1,str2));
	printf("%s\n\n",strcpy(str1,"defgh")); 
	
	//左串必须是字符数组名,不可以是字符串常量。 
//	printf("%s\n",strcpy("abc",str1));
	//DEVC++ 异常显示(让输入一个字符,输完后直接结束程序了);菜鸟编译报错 : \
	warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] \
	ISO c++禁止将字符串常量转换为'char*' [-Wwrite-strings]  
	
	//2.左串必须有足够的的空间,可以容纳右串。 
	printf("%s\n",strcpy(str1,"defghi")); 
	printf("复制超过初始化时字节数的字符串后的字节数为:%d\n\n",sizeof(str1)); //6
	//DEV C++没报错,甚至输出了右串;菜鸟编译通过了但给了警告 :\
	warning: 'void* __builtin_memcpy(void*, const void*, long unsigned int)' \
	writing 7 bytes into a region of size 6 overflows the destination [-Wstringop-overflow=] \
	将7个字节写入一个6大小的区域会溢出目标  
	
	//3.复制时若遇到右串中的'\0'就终止复制
	printf("%s\t%d\n",strcpy(str1,"a\0bcd"),strlen(str1)); 
	printf("%s\t%d\n",strcpy(str1,"ab\0cd"),strlen(str1)); 
	printf("%d\n",strlen(str1));

	system("pause"); 
	
 } 


【运行结果】


abc
defgh

defghi
复制超过初始化时字节数的字符串后的字节数为:6

a       6
ab      1
2


1.2 strncpy函数

调用格式:

strncpy(左串,右串,n); //n为有效长度

作用:

将右串(字符串常量或字符数组名)的前n个字符赋值给左串(字符数组名),左串其余字符保持原样。若右串的有效长度内有\0,则复制时会遇到\0,\0以及之后的字符就不复制给左串了 。如果 右串 中少于 n 个字符,则用'\0'填充

返回值:

同上

实例:


//字符串处理函数 - strncpy函数 
#include<stdio.h>
#include<string.h>

/* 	strncpy(左串,右串,n);  //n为有效长度 
 * 	作用:将右串的前n个字符赋值给左串,左串其余字符保持原样。若右串的有效长度内有\0,则复制时会遇到\0,\0以及之后的字符就不复制给左串了 。 
 *	返回值:复制后左串的首地址 
 */ 
int main()
{
	char str1[] = {"abcde"}; 
	char str2[] = {"HIJKLMN"};	
	char str3[] = {"A\0BCDE"}; //\0 作为字符串的结束标志
		
	printf("1.字节数为:%d,%d\n",sizeof(str1),sizeof(str2));	 //6,8
		 
	printf("2.%s\n",strncpy(str1,str2,3));	//HIJde
	printf("3.字节数为:%d,%d\n",sizeof(str1),sizeof(str2));	 //6,8
		
	printf("4.%s\n",strncpy(str2,str1,4));    //HIJdLMN 
	//执行此语句之前,str1的值已经变为了:HIJde 
		
	printf("5.%s\n",strncpy(str2,str1,7));    //HIJde
	//若下标越界(str1一共5个有效长度,我们却让他赋值7个有效长度字符),C语言编译器没有报错,在线编译器在n==14之前没报错,14之后报错了 
	printf("6.字节数为:%d,%d\n",sizeof(str1),sizeof(str2)); 	//6,8
		
	strcpy(str1,"asdasdasdassdasd");	//右串有16个字母。
	printf("7.字节数为:%d,%d\n",sizeof(str1),strlen(str1)); //6,16
	//求长度不受字节数的限制,即使内存溢出了 (如本题字节数为6,但长度却可以为16) 
	//字符串的字节数也不受长字符串复制给它的影响,以定义、初始化时的字节数作为字节数(如 \
	本题给它赋值了个16字符长度的串,但左串的字节数始终为6)。 

	//若右串的有效长度内有\0,则复制时会遇到\0,\0以及之后的字符就不复制给左串了 。
	printf("8.%s\n",strcpy(str1,str3));	//A
	//本题的右串有效长度为1,所以只把右串的前1个字符复制给了左串,左串其余字符不变。 
	printf("9.字符串str3的输出结果为:%s,有效长度为:%d,字节数为:%d\n",str3,strlen(str3),sizeof(str3));//A,1,7
	//由于右串的有效长度为1,所以输出结果也只输出\0前的字符,有效长度也只计算\0前的长度,而字节数不受\0限制。 
 } 


【运行结果】


1.字节数为:6,8
2.HIJde
3.字节数为:6,8
4.HIJdLMN
5.HIJde
6.字节数为:6,8
7.字节数为:6,16
8.A
9.字符串str3的输出结果为:A,有效长度为:1,字节数为:7


2.strcat函数 string concatenate

将右边字符串连接到左边字符串的末尾(覆盖掉左串的'\0')。

注意:

(1)左串必须是字符数组名,右串可以是字符数组名或字符串常量。

(2)左边字符串的数组大小要 >= 当前左字符串大小+右字符串-1(编译器对于此项不太严格,DEV C++直接不检测该项也可以输出)如下面的两张图

(3)右串的首字符会覆盖掉左串的结束标志'\0'


	char a[] = "he\0llo," , b[] = "how are you!";
	
	printf("%s",strcat(a,b));	//hehow are you!


(菜鸟在线)

(DEV C++)

3.strcmp函数 string compare

左串与右串作比较:

比较方法:从首字母起,依次比较ASCLL码值。直到'\0'结束。如果所有字符都相同,返回0,否则返回>0或<0

strcmp函数可以比较两个数组、两个字符串常量、或比较数组和字符串常量。



左串 右串


返回值


>


正数


<


负数


==


0


K&R 2 与 C11标准中,返回值是返回一个正数、负数、0。关于具体的数值没有做具体规定(由编译器自己决定)

不同编译器具体实现的效果可不同,在DEV C++和VS2019是返回1、-1、0,在线编译器中是返回左串-右串的值


#include<stdio.h>
#include<string.h>

int main()
{
	char a[] = "abc", b[] = "abc", c[] = "a\0bc";

	printf("%d\n", strcmp(a, b));	//0 注意这是判断大小,不是判断是否相等
	printf("%d\n", strcmp(a, c));	//VS2019、DEV C++:1 菜鸟:98 
	printf("%d\n", strcmp("ab\0c","abc"));	//-1

	return 0;
}


注:对字符串的比较不能用 == ,对字符的比较可以用 ==

4.strlen函数 string length

strlen函数测量字符数组的长度

可以测字符串常量的长度:


	printf("%d", strlen("abc"));	//3
	printf("%d", strlen("ab\0c"));	//2


求串的有效长度,只测\0之前的字符数量。

strlen与sizeof的区别:数组

5.strlwr(串) string lowercase

大写转为小写

6.strupr(串) string uppercase

小写转为大写

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。