标签:alc print 取数据 icm 二级指针 aaaaa ret 字符串常量 内存地址
#include <stdio.h> #include <stdlib.h> //在各种编程语言中,字符串的地位都十分重要,C语言中并没有提供“字符串”这个特定类型,而是以特殊字符数组的形式来存储和处理字符串, // 这种字符数组必须以空字符’\0’结尾,因此,也将这种特定字符数组称为C风格字符串,本节讨论字符串和字符串的一些处理函数。 // C风格字符串是字符数组的一种特例,这个“特”字体现在“以’\0’(空字符,null character)结尾 void main1(){ char *strB[100] = {"China is great!"}; //字符串数组的正确定义方式,大括号可以省略 char str[10]="calc"; //字符串常量,默认会在后面加 ‘\0‘作为结束符,‘\0‘的ASCCI码为0,也就是 ‘\0‘等价于ASCII码 0,‘\0‘不计入字符串的长度, // 注意ASCII码0不是数字0,数字0的ASCII码是48 //char str[4] = {‘c‘,‘a‘,‘l‘,‘c‘}; //无法按照%s输出calc,会继续往后读取数据 // char str[5] = {‘c‘,‘a‘,‘l‘,‘c‘,‘\0‘}; //按照%s正确输出calc,遇到‘\0‘就结束 // char str[5] = {‘c‘,‘a‘,‘l‘,‘c‘,‘0‘}; //无法按照%s输出calc,‘0‘不是‘\0‘,会继续往后读取数据 // char str[10] = {‘c‘,‘a‘,‘l‘,‘c‘,‘0‘}; //按照%s输出calc0,‘0‘不是‘\0‘,但是‘0‘后面的字符会默认赋值为‘\0‘,遇到‘\0‘就结束 // char str[5] = {‘c‘,‘a‘,‘l‘,‘c‘}; //按照%s正确输出calc,str[4]没有指定值,会默认赋值为‘\0‘,也是就是ASCII码 0,遇到‘\0‘就结束 char *format = "str=%d, calc=%d\n"; printf(format, sizeof(str), sizeof("calc")); //str=10, calc=5 str[4]之后的都是默认为asci码的0,按照%c解析是‘\0‘ //打印字符数组 for (int i = 0; i < 10; ++i) { printf("str[%d]=[%d][%c]\n",i,str[i],str[i]); } /* str[0]=[99][c] str[1]=[97][a] str[2]=[108][l] str[3]=[99][c] str[4]=[0][ ] 默认赋值为ASCII码0,也是‘\0‘,空字符,注意ASCII码0不是数字0,数字0的ASCII码是48 str[5]=[0][ ] 默认赋值为0000000000000000二进制,按照%d和%c的解析方式不一样,结果因也会不一样 str[6]=[0][ ] str[7]=[0][ ] str[8]=[0][ ] str[9]=[0][ ]*/ printf("%s\n",str); //按照%s打印,遇到 ‘\0‘才结束,没有就一直向前 //system(str); int a[5] ={1,2,3}; for (int j = 0; j < 5; ++j) { printf("[%d],[%c]",a[j],a[j]); //[1],[╔][2],[╗][3],[╚][0],[ ][0],[ ] } //结论:默认赋值为0000000000000000二进制,按照%d和%c的解析方式不一样,结果因也会不一样 // 整形数组会默认赋值为数字0,字符数组会默认赋值为‘\0‘ } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void main2(){ char *str = "China is great!"; //把字符串常量的首地址赋值给指针str printf("str=%d,China is great!=%d\n", sizeof(str), sizeof("China is great!")); //str=4,China is great!=16 //str=4,China is great!=16 str是一个指针,固定4个字节 printf("*Before:str =%c \n",*str); //output:C //*str =‘A‘; //*str是字符常量C,无法给它赋值,常量只能读,不可以写 printf("*After: str=%c\n",*str); //output:C //对比下面的数组方式 char strA[20] ="China is great!"; //字符数组是按照字符串常量一个一个依次给数组元素,数组strA是一个变量,可以赋值 printf("str=%d,China is great!=%d\n", sizeof(strA), sizeof("China is great!")); //str=20,China is great!=16 //str=20,China is great!=16 str是一个数组 printf("Before:*strA=%c",*strA); //output:C *strA =‘A‘; //数组strA是一个变量,可以赋值 printf("*After: strA=%c\n",*strA); //output:A } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void main3(){ char *str = "China is great!"; //把字符串常量的首地址赋值给指针str int i =0; //统计字符串的长度 while (*str){ //*str==‘\0‘ putchar(*str); str++; i++; } printf("%d\n",i); // 15 未统计‘\0‘ printf("%d\n", sizeof("China is great!")); //16 //对比下面的数组方式 char strA[20] ="China is great!"; //字符数组是按照字符串常量一个一个依次给数组元素,数组strA是一个变量,可以赋值 //int *p = strA; //错误,不能用int * 指针读取 char *p =strA; while (p[0] != ‘\0‘){ //p[0]总是p指针往后移动的第一个字符 putchar(p[0]); p++; } } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // //二维数组存储字符串,每个一维数组都是一个字符串 void main4(){ char str[5][6] ={ {"calc"},{"china"},{"great"}}; // {"calc","china","great"} 里层的大括号可以省略 for (int i = 0; i < 5; ++i) { printf("str[%d]=[%s]\n",i,str[i]); } } /* str[0]=[calc] str[1]=[china] str[2]=[great] str[3]=[] str[4]=[] */ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // //字符指针和字符数组的初始化 void main5() { //字符数组 printf("字符数组\n"); char str[100]={0}; scanf("%s",str); printf("\n%s",str); //字符指针 printf("字符指针\n"); //char *strP; //未初始化,是一段不可预知的内存地址 //char *strP =NULL; //NULL的地址是0x000000,与系统访问冲突, //char *strP ="AAAAAAA"; "AAAAA"是常量,不能再次被赋值,常量不可以写 char *strP =str; //指针变量得指向一段可读可写的区域 scanf("%s",strP); printf("%s",strP); } /*str是地址常量;strP是地址变量 strP接受键入字符串时,必须先开辟存储空间 * 例 char str[10]; scanf(“%s”,str); (?) 而 char *cp; scanf(“%s”, cp); (X) * 改为: char *cp,str[10]; cp=str; scanf(“%s”,cp); (1) 字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串第1个字符的地址),决不是将字符串放到字符指针变量中。 (2)编译时为字符数组分配若干存储单元,以存放各元素的值,而对字符指针变量,只分配一个存储单元存储地址 scanf和printf char ch[100]; scanf(“%s”,ch); 空格、制表符、换行为分隔符,作为输入结束符 printf(“%s”,ch); 输出后不会自动换行 gets和puts char ch[100]; gets(ch); 回车为分隔符,作为输入结束符 puts(ch); 输出后会自动换行 */ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /*//字符数组只有一个好处,就是可以整体是输入和输出,其他和数组一样,不能比较大小和四则运算,只能以字符元素来操作 头文件:#include <string.h> strstr()函数用来检索子串在字符串中首次出现的位置,其原型为: char *strstr( char *str, char * substr ); 【参数说明】str为要检索的字符串,substr为要检索的子串。 【返回值】返回字符串str中第一次出现子串substr的地址;如果没有检索到子串,则返回NULL。 strcmp int strcmp (const char* str1,const char* str2) 功能:字符串比较 返回值:若参数s1和s2字符串相同则返回0,s1若大于s2则返回大于0的值,s1若小于s2则返回小于0的值 判断两个字符串大小1)ASII码 2)长度 区分大小写比较的,如果希望不区分大小写进行字符串比较,可以使用stricmp函数 strncmp strchr */ //自定义函数实现strcmp int myStrcmp(char *str1, char *str2){ int i =0; while (str1[i] == str2[i] && str1[i] !=‘\0‘){ i++; } return str1[i] - str2[i]; } void main6(){ char str1[30] = "greatD"; char str2[30] = "grec"; if(myStrcmp(str1,str2) <0 ) { printf("str1 < str2"); } else if(myStrcmp(str1,str2) > 0 ) { printf("str1 > str2"); } else{ printf("str1 = str2"); } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //二级指针字符串 #include <string.h> char str1[20] ="notepad"; char str2[20] ="calc"; void change(char **str){ //函数有副本机制,会新建一个二级指针变量str来存储main函数中p传过来str1的首地址 printf("str in change: %p,%p\n",str,str2); //str in change: 00403008,0040301C *str = str2; // *str就相当于一级指针 char * 用来改变main中p指针变量自己的首地址 *str=p=str2 printf("change:%s,%p\n",*str,*str); //change:calc,0040301c } void main(){ char *p =str1; printf("p in main: %p,%p\n",p,str1); //p in main: 00403008,00403008 change(&p); //change把p的指向给改变,等价于p=str2 printf("after change: %s,%p\n",p,p); //after change: calc,0040301c }
标签:alc print 取数据 icm 二级指针 aaaaa ret 字符串常量 内存地址
原文地址:https://www.cnblogs.com/luoxuw/p/11329030.html