第10章字符串 C语言是用一维字符数组来存储字符串
第10章 字符串 C语言是用一维字符数组来存储字符串
10.1用一个一维字符数组来存储字符串 字符串:一系列字符组成的字符系列。在C语言 中所有以双引号括起来的字符都以字符串方式存 储。如:” China”,“ I am a boy”,“a”,“A” ■C语言中以字符’\0作为字符串的结束标 志。’Ⅷ0是转义字符,称为空字符,其ASCH1 为0。’10作为标志要占用存储空间(1byte) 但不计入字符串的长度 ■C语言中字符串常量就是一个一维字符数组,所 以它给出的是该字符串的首地址
10.1 用一个一维字符数组来存储字符串 ◼ 字符串:一系列字符组成的字符系列。在C语言 中所有以双引号括起来的字符都以字符串方式存 储。如:”China”, “I am a boy.”, “a”, “A” ◼ C语言中以字符’\0’作为字符串的结束标 志。’\0’是转义字符,称为空字符,其ASCII码 为0。’\0’作为标志要占用存储空间(1byte), 但不计入字符串的长度。 ◼ C语言中字符串常量就是一个一维字符数组,所 以它给出的是该字符串的首地址
■例如: char str[101, "ps, str= hello!. ERROR/ st是一维数组名,其为地址常量,不能再次赋 值 ps= hello!: /OK/ ps是字符指针,将字符串常量”helo!"赋值给 ps实际上是将该字符串在内存的首地址赋值给 ps
◼ 例如: char str[10], *ps; str = “hello!”; /*ERROR*/ str是一维数组名,其为地址常量,不能再次赋 值。 ps = “hello!”; /*OK*/ ps是字符指针,将字符串常量”hello!”赋值给 ps实际上是将该字符串在内存的首地址赋值给 ps
10.1.1一维字符数组的初始化 ■用一般的给数组初始化的方法。如: char str[10]={s,t,r,,n,g,"!;10}; s t nlg! \0\o\o ■上述初始化方式等价于 char str[10]=('s,'t,r,, i,'n,,g,, !1 因为初值个数少于10,系统会自动对未赋值的 元素赋值“0
10.1.1 一维字符数组的初始化 ◼ 用一般的给数组初始化的方法。如: char str[10] = { ‘s’,’t’,’r’,’i’,’n’,’g’,’!’,’\0’ }; ◼ 上述初始化方式等价于 char str[10] = { ‘s’,’t’,’r’,’i’,’n’,’g’,’!’ }; 因为初值个数少于10,系统会自动对未赋值的 元素赋值 ‘\0’ s t r i n g ! \0 \0 \0
■初始化时也可以省略字符数组的大小,但此时 必须人为地在字符串末尾加‘0以作为字符 串结束标志。如: char str1]={C,"h,,"n,"a,"0} char str2[]={C’,h,","n,a'}; str的长度为5,占用6个字节的存储空间,有 字符串结束标志。str2占用5个字节的存储空间, 没有字符结束标志,系统不知道该字符串在哪 里终止
◼ 初始化时也可以省略字符数组的大小,但此时 必须人为地在字符串末尾加 ‘\0’ 以作为字符 串结束标志。如: char str1[ ] = { ‘C’, ‘h’, ‘i’, ‘n’, ‘a’, ‘\0’ }; char str2[ ] = { ‘C’, ‘h’, ‘i’, ‘n’, ‘a’ }; str1的长度为5,占用6个字节的存储空间,有 字符串结束标志。str2占用5个字节的存储空间, 没有字符结束标志,系统不知道该字符串在哪 里终止
■直接用字符串初始化字符数组。如: char str[10]={“ string!”};/OK* 习惯上可以简写为 char str10]=“ string!”;/OKk 系统会自动在字符串末尾加上“0作为结束 标志
◼ 直接用字符串初始化字符数组。如: char str[10] = { “string!” }; /*OK*/ 习惯上可以简写为 char str[10] = “string!”; /*OK*/ 系统会自动在字符串末尾加上 ‘\0’ 作为结束 标志
■需要注意的是,定义的字符数组的元素个数 定要比字符串中的字符个数至少多一个,因为 多的一个要存储结束标志“0,否则将破坏其 他数据或程序代码。如: char strl6]=“" China”;/OK char str[5]="China; /*ERROR*/ ■也可用如下方式定义: char str[]=string!"/OK 系统会自动在末尾加“\0,str的元素个数为8
◼ 需要注意的是,定义的字符数组的元素个数一 定要比字符串中的字符个数至少多一个,因为 多的一个要存储结束标志 ‘\0’,否则将破坏其 他数据或程序代码。如: char str[6] = “China”; /*OK*/ char str[5] = “China”; /*ERROR*/ ◼ 也可用如下方式定义: char str[ ] = “string!” /*OK*/ 系统会自动在末尾加 ‘\0’,str的元素个数为8
char mark[10]=“ C program.”;/OK* char mark[10] mark=“ C Program.;/“ ERROR* char mark[10] int i for(=0;i<9;i++) scanf( %c",&mark[) mark[=10 /OK*/
char mark[10] = “C program.”; /*OK*/ char mark[10]; mark = “C Program.”; /*ERROR*/ char mark[10]; int i; for(i = 0; i < 9; i++) scanf("%c", &mark[i]); mark[i] = '\0'; /*OK*/
10.2字符串与字符指针 ■同数组一样,可以定义指针变量指向字符串。 实质上是将该字符串的首地址赋值给指针变量 char *ps=“ From one"; 其实质是将无名字符串” from one”的起始地址 赋值给指针变量ps,此时 *ps的值为‘f,(ps+1)的值为’r'。 char strl]=" from two”; char ps= str, 此时是将字符数组str(也是字符串)的首地址赋 值给ps,即ps与&str0]是等价的
10.2 字符串与字符指针 ◼ 同数组一样,可以定义指针变量指向字符串。 实质上是将该字符串的首地址赋值给指针变量 char *ps = “from one”; 其实质是将无名字符串”from one”的起始地址 赋值给指针变量ps,此时 *ps 的值为 ‘f’, *(ps+1)的值为’r’。 char str[ ] = “from two”; char *ps = str; 此时是将字符数组str(也是字符串)的首地址赋 值给ps,即ps与&str[0]是等价的
■字符数组与字符指针的区别 char mark[]="C program char *park ="C program ■这两种方式存储的内存模型是不同的
◼ 字符数组与字符指针的区别 char mark[ ] = “C program”; char *pmark = “C program”; ◼ 这两种方式存储的内存模型是不同的