码迷,mamicode.com
首页 > 其他好文 > 详细

15.字符串

时间:2018-08-16 23:42:47      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:name   class   uri   规则   为我   计算   大小   unsigned   res   

//c字符串
/*
	在 C 语言中,字符串实际上是使用 null 字符 ‘\0‘ 终止的一维字符数组。
	因此,一个以 null 结尾的字符串,包含了组成字符串的字符。
	下面的声明和初始化创建了一个 "Hello" 字符串。
	由于在数组的末尾存储了空字符,所以字符数组的大小比单词 "Hello" 的字符数多一个。
	char greeting[6] = {‘H‘, ‘e‘, ‘l‘, ‘l‘, ‘o‘, ‘\0‘};
	依据数组初始化规则,可以把上面的语句写成以下语句:
	char greeting[] = "Hello";
	以下是 C/C++ 中定义的字符串的内存表示:
	index		0		1		2		3		4		5		
	variable	H		e		l		l		o		\0
	address		0x23451 0x23452 0x23453 0x23454 0x23455 0x23456
*/
#include <stdio.h>
int main01()
{
	char greeting[]={‘H‘,‘e‘,‘l‘,‘l‘,‘o‘,‘\0‘};
	char name1[]="abcde\0";
	char name2[]="abcde";
	printf("greeting=%s\n",greeting); //greeting=Hello
	printf("name1=%s\n",name1);//name1=abcde
	printf("name2=%s\n",name2);//name2=abcde
	//在char xx[]="";这种形式初始化的时候,不需要加上\0,当然加不加也无所谓不会影响
	//但是{}的时候必须加上‘\0‘,否则会打印乱码。
	return 0;
}

//而且c中有很多字符串的操作,当然搞py的,觉得这操作简直不能······
//当然c作为执行效率极高的语言,很多操作都要自己写的,能有这些谢天谢地了
//毕竟连a,b=b,a都不支持,还需要找一个中间变量作为中介进行交换的语言,有这些就不错了
//这些操作都定义在一个名为<string.h>的头文件下,因此使用的时候必须要导入
#include <string.h>
int main02()
{
	char s1[]="i love";
	char s2[]=" emm";
	//strcpy(s1,s2);将s2复制到s1
	strcpy(s1,s2);
	printf("s1=%s\n",s1); //s1= emm
	
	char s3[]="i love";
	char s4[]=" matsuri";
	//strcat(s1,s2);将s2连接到s1的末尾;
	strcat(s3,s4);
	printf("s3=%s\n",s3);//s3=i love matsuri
	
	char s5[]="i love";
	char s6[]=" matsuri";
	//strcmp(s1,s2);如果s1和s2是相同的返回零,s1小于s2返回小于0,s1大于s2,返回大于0
	printf("%d\n",strcmp(s5,s6)); //1
	
	char s7[]="i love";
	//strchr(s,ch);返回一个指针,指向字符串s中,ch第一次出现的位置
	printf("%p\n", strchr(s7,‘e‘)); //0061FF02
	printf("%c\n", *strchr(s7,‘e‘));//e
	
	char s8[]="i love matsuri";
	char s9[]="tsuri";
	//strstr(s1,s2);返回一个指针,指向字符串s1中s2第一次出现的位置
	printf("%p\n",strstr(s8,s9));//0061FEF7
	//这里的指针显然是字符串s9首元素的地址,那么加上*,可以打印首元素t
	//既然是数组,又是首元素的地址,那么数组内存又是连续的,所以以%s可以直接打印出数组
	printf("%c--%s\n",*strstr(s8,s9), strstr(s8,s9)); //t--tsuri
	
	char s[]="i love matsuri";
	printf("%d\n",strlen(s)); //14
}

//笔记
/*
	字符串在用{}进行初始化的时候,必须加上‘\0‘,如果不加看看有什么后果
*/
int main03()
{
	char greeting[]={‘h‘,‘e‘,‘l‘,‘l‘,‘o‘};
	printf("greeting=%s\n",greeting);//greeting=helloa
	//使用""的方式可以不用加
	char g[]="hello";
	printf("g=%s\n",g);//g=hello
}

//strlen可以计算数组的长度,之前的sizeof(arr)/sizeof(arr[0])也可以计算,两者间有什么区别呢?
/*
	首先strlen是函数,sizeof是运算操作符,二者得到的结果均为size_t,即unsigned int类型
	大部分程序在编译的时候,就已经把sizeof计算过了,而strlen的结果要在程序运行的时候才能出来
	sizeof是计算变量的大小,不受\0的影响
	而strlen是计算字符串的长度,受\0的影响
*/
int main()
{
	char *str1="myname";
	char str2[]="myname";
	char str3[8]={‘m‘,‘y‘,‘n‘,‘a‘,‘m‘,‘e‘};
	char str4[]="as\0df";
	printf("sizeof(str1)=%d, strlen(str1)=%d\n", sizeof(str1), strlen(str1));
	printf("sizeof(str2)=%d, strlen(str2)=%d\n", sizeof(str2), strlen(str2));
	printf("sizeof(str3)=%s, strlen(str3)=%d\n", str3, strlen(str3));
	printf("sizeof(str4)=%d, strlen(str4)=%d\n", sizeof(str4), strlen(str4));
	/*
	sizeof(str1)=4, strlen(str1)=6
	sizeof(str2)=7, strlen(str2)=6
	sizeof(str3)=8, strlen(str3)=6
	sizeof(str4)=6, strlen(str4)=2
	*/
	//分析
	/*
		str1是指针类型,sizeof获得的是该指针所占的空间,是4个字节,strlen计算指针指向的字符串的长度,
		不计算‘\0‘,所以是6
		str2是字符数组,大小有字符串常量确定,sizeof是获取数组所占内存的大小,‘\0‘是包含在内的,所以是7个,
		strlen计算字符串的长度,所以是6,因为不包含‘\0‘,尽管它占用内存,因为我们计算的是长度,不是空间
		str3也是字符数组,但大小已经确定为8,即使没有那么多的字符,但是我们在定义的时候已经表明了,
		要向操作系统申请8个字节的空间来容纳这个数组,而strlen计算字符的长度,所以是3,关于这个为什么没有乱码,
		是因为我们已经指定了8个,那么如果不够就会用‘\0‘填充,但如果不指定个数,使用{}初始化的时候必须加上‘\0‘
		str4也是数组,我们看得到的有五个元素,加上结尾看不到的‘\0‘,一共六个,strlen计算字符串的长度,遇见‘\0‘
		就结束了,所以是2
	总结一句就是sizeof计算的是变量的大小,而strlen计算的是字符串的长度
	前者不受字符‘\0‘影响,后者以‘\0‘作为长度判定依据。
	*/
}

	

	

  

15.字符串

标签:name   class   uri   规则   为我   计算   大小   unsigned   res   

原文地址:https://www.cnblogs.com/traditional/p/9490714.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!