标签: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=helloa //使用""的方式可以不用加 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‘作为长度判定依据。 */ }
标签:name class uri 规则 为我 计算 大小 unsigned res
原文地址:https://www.cnblogs.com/traditional/p/9490714.html