C语言全国计算机二级等级考试教程第10章 字符串(章节带习题)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
输出时直到遇第一 char str[ ]=“I love you!” , *p=str; 个‘\0‟结束输出。 字符指针变量 printf(“%s\n” , p); 字符数组名
输入项 字符指针变量
转去介绍
10.3 字符串的输入和输出
字符数组名
输入项
字符指针变量 当字符数组名作为输入项: char str[15]; scanf(“%s”,str); 在内存中的形式是: P R 输入形式为: PROGRAMMING<CR> O G R A M M I N Ga赋初值后的存储示意图
10.4 字符串数组
可以定义字符型指针数组并通过赋初值来构成一个类似的字符串数组。 例如:char *pa[3]={“a”, ”bb”, ”ccc”}; 定义了一个字符型指针数组,该数组中含有3个元素pa[0] 、pa[1]、 pa[2],且每一个 元素都是一个指向字符串的指针。
则在str中存入的只是字符串“APROGRAM”,而不是字符串“APROGRAM MING
10.3 字符串的输入和输出
10.3.3 调用gets、puts函数在终端输入或输出一行字符串
调用gets函数来输入字符串,例如: char str[15]; gets( str ); 在内存中的形式是: A P 若从键盘上依次输入: APROGRAM MING<CR> R O G R A M M I N G \0 \0
★ 两个字符串分别占有不同的存储空间。 ★ 指针变量pmark中的地址可以改变而指向另外一个长度 不同的字符串。
10.3 字符串的输入和输出
10.3.1 输入和输出字符串时的必要条件
输入和输出的格式说明符为 %s 对字符串输入输出时的必要条件: 字符串常量 输出项 字符数组名 printf(“%s\n” , ”I love you!”); char str[ ]=“I love you!”; printf(“%s\n” , str); I love you!
10.2 使指针指向一个字符串
可以在定义字符指针变量的同时,将一个字符串赋值给指针变量。例如: char *ps1=“form one”; 如上,是把存放字符串常量的无名存储区的首地址赋给指针变量ps1,使ps1 指向字符串的第一个字符f。如下图所示: ps1 form one\0 无名存储区 又如: char str[]=“form two”, *ps2=str; 在定义指针变量的同时让指针变量指 向了str的首地址,即指向了字符串的 第一个字符f。
注意
10.1 用一维字符数组存放字符串
10.1.2 在C程序执行过程中给一维字符数组赋字符串
在定义时,给一维字符数组赋字符串: char mark[10]=“C Program”; (合法) 数组名为地址值,为一个 地址常量,不能被赋值。 char mark[10]; mark=“C Program”; (非法)
10.2 使指针指向一个字符串
用字符数组作为字符串和用指针指向的字符串之间的区别
若有以下定义: char mark[ ]= “PROGRAM”; char *pmark= “PROGRAM”; 它们在内存中的存储形式如下: mark pmark P R O G R A M \0
PROGRAM\0
区别
char str[10]={„s‟, ‟t‟, ‟r‟, ‟i‟, ‟n‟, ‟g‟, ‟!‟};
在内存中的存储形式是: s t r I n g ! \0 \0 \0
也可以按这种形式进行赋值: char str[10]={„s‟, ‟t‟, ‟r‟, ‟i‟, ‟n‟, ‟g‟, ‟!‟, „\0‟}; 在内存中的存储形式是: s t r I n g ! \0 \0 \0
调用puts函数来输出字符串,例如: char str[15]; gets( str ); puts( str );
空格一起 读入
系统自动会用’\0‟替代 最后的换行符<CR>。
若从键盘上依次输入: APROGRAM MING<CR> 输出结果为: APROGRAM MING
依次输出存储单元中的字符,遇到第一个’\0‟即结束输出,注意,调用该puts函数 输出时,系统并自动输出一个换行符。
注意
10.1 用一维字符数组存放字符串
10.1.1 通过赋初值的方式给一维字符数组赋字符串
★ 如下定义的是含有10个整型元素的一维数组,并初始化。 int a[10]={2,4,6,8,10}; 在内存中的存储形式是: 2 4 6 8 10 0 0 0 0 0
★ 如下定义的是含有10个元素的一维字符数组,并初始化。
第10章 字符串
10.1 10.2 10.3 10.4 10.5 10.6
用一维字符数组存放字符串 使指针指向一个字符串 字符串的输入和输出 字符串数组 用于字符串处理的函数 程序举例
10.1 用一维字符数组存放字符串
字符常量:是用单引号括起来的一个字符。 例如 „A‟ „C‟ „t‟ „!‟ „?‟
以下的赋值语句也是错误的: char str1[10]=“computer”, str2[10]; /*分别定义两个一维字符数组*/ str2=str1; /*赋值不合法*/
赋值号左边也为数组名
10.1 用一维字符数组存放字符串
10.1.2 在C程序执行过程中给一维字符数组赋字符串
例如,我们已经定义了一个一维字符数组,如下: char mark[10]; 我们也可以逐个给数组元素进行赋值,例如: mark[0]=„C‟; mark[1]=„ ‟; mark[2]=„P‟; mark[3]=„r‟; mark[4]=„o‟; mark[5]=„g‟; mark[6]=„r‟; mark[7]=„a‟; mark[8]=„m‟; mark[9]=„\0‟; 也可以在程序运行的过程当中,通过一个循环语句,从键盘上向数组中 输入指定的字符。如下: char mark[10]; int i; for(i=0;i<9;i++) scanf(“%c”,&mark[i]); /*通过键盘(终端)接收9个字符*/ mark[i]=„\0‟; 如从第一列输入: C Program<CR> 循环结束后,给mark[9]赋 予结束标志’\0‟。 在内存中的存储形式是: C P r o g r a m \0
此函数功能是计算出以s为起始地址的字符串的长度,并作为函数返回值。 注意:不包括串尾的结束标志’\0‟。 ★ 字符串比较函数strcmp。调用形式为: strcmp(s1,s2);
此函数功能是来比较s1和s2所指字符串的大小。若s1>s2,函数值为大于0(正数)的数; 若s1==s2,函数值等于0;若s1<s2,函数值为小于0(负数)的数。
当字符指针变量作为输入项:
char str[15] , *p=str; scanf(“%s”,p);
操作功能和上面相同
说明
① 当字符数组名作为输入项时,输入字符串的长度最好不要超过 字符数组的个数。 ② 当字符指针变量作为输入项时,该指针变量必须已指向确定的 有足够空间的连续存储单元。 ③ 用%s格式符输入字符串时,空格和回车符都作为输入数据的分隔符 而不能被读入。例如以上程序段输入:APROGRAM MING<CR>
元留给’\0‟,在二维字符数组中,每一行的最后一个存储单元都要有一个’\0‟。 字符串数组也可以在定义的同时赋初值。 例如:char ca[3][5]={“A”, ”BB”, ”CCC”}; ca[0][0] ca[0] ca[1] ca[2] A B C \0 B C \0 \0 C \0 \0 \0 \0 \0 \0 定义时赋初值时行下标可以省略: char ca[ ][5]={“A”, ”BB”, ”CCC”};
此函数功能是把s2所指字符串的内容复制到s1所指存储空间中,函数返回s1的值(即s1 的首地址)。注意:为保证复制的合法性,s1必须指向一个足够容纳s2串的存储空间。 ★ 字符串连接函数strcat。调用形式为: strcat(s1,s2);
此函数功能是把s2所指字符串的内容连接到s1所指的字符串后面,并自动覆盖s1串 末尾的’\0‟,函数返回s1所指的地址值。注意:s1所指字符串应有足够的空间容纳 两串合并后的内容。 ★ 求字符串长度函数strlen。调用形式为: strlen(s);
10.4 字符串数组
所谓字符串数组就是一个二维字符数组。 例如:char name[10][80]; /*定义了一个10行80列的二维字符数组*/ 也可以把该二维数组视为由10个一维数组构成,每一个一维数组中又包含 80个数组元素。
注意:作为字符串使用时,每一行最多可以存放79个有效字符,最后一个存储单
无论用上面哪中方式赋值,字符串中的结束标志总是为第一个。
10.1 用一维字符数组存放字符串
10.1.1 通过赋初值的方式给一维字符数组赋字符串
也可以用赋初值的方式来定义字符数组的大小,这时定义时一定要写成: char str[]={„s‟, ‟t‟, ‟r‟, ‟i‟, ‟n‟, ‟g‟, ‟!‟, „\0‟}; ★ 该字符串的实际长度为7。 ★ 该数组中包含了8个元素,在这种情况下,一定要人为的在后面加一个’\0‟。 否则该数组中就没有结束标志,就不能称数组中存放的是字符串了。 例如: char str[]={„s‟, ‟t‟, ‟r‟, ‟i‟, ‟n‟, ‟g‟, ‟!‟};
ps2
form two\0 str
10.2 使指针指向一个字符串
通过赋值运算使指针指向一个字符串
例如:char *ps1; ps1=“from one”; 使指针ps1指向字符 串的第一个字符f。
又如:char str[ ]=“from two”, *ps2; ps2=str; 使指针ps2指向了存放字 符串的字符数组str的首 地址。
pa[1][1] pa[2][1]
pa[2][2]
10.5 用于字符串处理的函数
C语言中提供了很多有关串操作的库函数,调用这些库函数能够对字符串 进行整体的处理和一些操作。不过,在调用之前,必须在程序前面用命令 行指定包含标准的头文件。 #include <string.h>
★ 字符串复制(拷贝)函数strcpy。调用形式为: strcpy(s1,s2);
该数组中只包含7个元素
10.1 用一维字符数组存放字符串
10.1.1 通过赋初值的方式给一维字符数组赋字符串
也可以直接用字符串常量给一维字符数组赋初值。例如: char str[10]={ “sting!” }; 习惯上均省略花括号 char str[10]=“sting!”; 把一个字符串常量赋值给一个一维字符数组时,数组的元素个数 一定要大于字符串的实际长度 char str[6]=“sting!”;由于字符串的实际长度为6,而数组只有6个存储 单元,‘\0‟将无法存放。 如下的定义形式也可以正确进行: char str[ ]=“sting!”; 数组中包含7个元素 (含系统自动加的’\0‟)
10.6 程序举例
例10.1 编写函数slength(char *s),函数返回指针s所指字符串的长度,即 相当于库函数strlen功能。
#include <stdio.h> slength(char *s) { int n=0; while(*(s+n)!='\0') n++; return(n); } main() {char str[]="ABCDEF";int len; len=slength(str); printf("len=%d\n",len); }
pa[0] pa[1]
a b
\0 b \0
注意:各字符串所占存储单元之间并不一定
连续,访问这些字符串全依赖于pa。 可以引用的形式有: *(pa[0]+0)
pa[2]
c 图示
c
c
\0
*(pa[1]+0) *(pa[2]+0)
*(pa[1]+1) *(pa[2]+1) *(pa[2]+2)
pa[0][0] pa[1][0] pa[2][0]
在内存中占一个字节
字符串常量:是由双引号括起来的一串字符 。
例如 “CHINA” C H 在内存中占6个字节 I N A \0
在内存中的存储形式是:
在内存中,系统会自动的在字符串的末尾 加上一个‘\0‟,作为字符串的结束标志,系统 只要看到它就认为该字符串到此就结束了。 但要注意,该字符串的实际长度还是为5。 由于变量只能存放一个字符,所以字符串的存放只能存储 在数组当中。