C语言课程设计教程第10章__字符串(章节带习题)
《C语言程序设计》教材习题答案第10章

一、选择题1. 设已定义“int a,* p”,下列赋值表达式中正确的是:C)p=&a2. 设已定义“int x,*p=&x;”,则下列表达式中错误的是:B)&*x3. 若已定义“int a=1 ,*b=&a;”,则“printf(“%d \n”,*b);”的输出结果为:A)a的值。
4. 设已定义“int x,*p,*pl=&x,*p2=&x;”,则下列表达式中错误的是:C)p=p1+p2.5. 设有函数定义“void p(int *x){printf(“%d\n”,*x);}”和变量定义“int a=3;”,则正确的函数调用是:C)p(&a)6. 函数“int fun(char * x){char * y=x; while(*y)y++;return(y-x); }”的功能是A)求字符串的长度。
7. 运行一下程序,输出结果为:B)5 6int fun (int a,int *b){a++;(*b)++;return a+*b;}void main(){int x=1,y=2;Printf(“%d”,fun(x,&y));Printf(“%d”,fun(x,&y));}8. 运行以下程序,输出结果为:C)58#include<stdio.h>Int * fun(int a ,int *b){a++;(*b)++;*b=a+*b;return b;}Void main(){Int x=1,y=2,*z;Z=fun(x,&y);Printf(“%d”,*z);Z=fun(x,&y);Printf(“%d”,*z);}9. 若已定义“int a[]={1,2 ,3,4},*p=a;”,则下面表达式中值不等于2的是C)*(++a)10. 若已定义“int a[]={1,2 ,3,4},*p=a+1;”,则p[2]的值为C)411. 设已定义“int x[4][10],*p=x[0];”,则下列表达式中的值为整形的是B)*(p+1)12. 设已定义“char s[]=”ABCD”;”,”printf(“%s”,s+1)”的值为C)BCD13. 设已定义“char str[]=”abcd”,*ptr=str;”,则*(prt+4)的值为B)014. 下面对字符串变量的初始化或赋值操作中,错误的是C)char a[10];a=”OK”;15. 设已定义“char *ps[2]={“abc”,”1234”};”,则以下叙述中错误的是A)ps为指针变量,它指向一个长度为2的字符串数组16. 设已定义“struct {int a,b;} s,*ps=&s;”,则错误的结构体成员引用是C)*ps.a17. 设已有以下定义,则表达式的值为2的是A)k=++p->datastruct st {int data;st *link;} a[3]={1,a+1,3,a+2,5,0},*p=a;二、编程题1. 输入3个字符串,输出其中最大的字符串(用字符指针)#include <stdio.h>#include <stdlib.h>#define str_count 3#define str_length 100int main(int argc, char *argv[]){char a[str_count][str_length],*p;printf("请输入3个字符串:");int i;for(i=0;i<str_count;i++){scanf("%s",a[i]);}p=a[0];for(i=1;i<str_count;i++){if(strcmp(p,a[i])<0){p=a[i];}}printf("最大的字符串为:%s",p);system("PAUSE");return 0;}2. 定义一个函数,函数的功能是求已知半径的圆的周长和面积。
计算机二级C语言辅导 10章 字符串

例2. 删除一个字符串中的一个字符。 字符串由标准输入得到,欲删除的字符也由标准输入得到
main ( ) { char s[20],c; int i,j; gets(s); c=getchar( ); for (i=j=0;s[i]!=„\0‟;i++) if (s[i]!=c) s s[j++]=s[i]; s[j]=„\0‟; c=l }
p
i j
i j
i j
i
j
i
W
0
o
1
r
2
l
3
d
4
\0
5
例2. 删除一个字符串中的一个字符。 字符串由标准输入得到,欲删除的字符也由标准输入得到
main ( ) { char s[20],c; int i,j; gets(s); c=getchar( ); for (i=j=0;s[i]!=„\0‟;i++) if (s[i]!=c) s s[j++]=s[i]; s[j]=„\0‟; c=l }
H o w \0
0 1 2 3 4 5 6 7 8 9 10 11 12
字符数组
五、字符串处理函数: 1.puts(字符数组); 将字符串输出到终端,在输出时将字符串结束标记‘\0‟转换成‘\ char str[ ]={“China\nBeijing”}; puts(str); 输出:China Beijing 2.gets(字符数组)--读入全部字符(包括空格),直到遇到回车符为止 从终端输入一个字符串到字符数 如果输入以下12个字符: 组,并且得到一个函数值,该函 数值是字符数组的起始地址。
第十章 字符串
在C语言中,没有字符串这种数据类型, 因此可以将字符串存放在字符数组中。 这是处理字符串的方法之一。
C语言程序设计PPT课件第10章 字符串

pStr = &str[80/37];
10.4字符串的访问和输入/输出
char str[10];
按字符逐个输入/输出
for (i=0; str[i]!='\0'; i++) {
putchar(str[i]); } putchar('\n');
2020/3/29
一般不用字符串长度控制
9/37
10.4字符串的访问和输入/输出
string combination
strcat(str2, str1); str2必须足够大!
He l
l o \0 \0 \0 \0 \0 \0 \0 C h i n a \0
H e l l o C h i n a \0 \0
2020/3/29
24/37
字符串比较
#include <string.h> strcmp(字符串1,字符串2);
22/37
字符串复制
#include <string.h> strcpy( copy
字符串能否用=整体复制?
str2 = str1;
strcpy(str2, str1);
2020/3/29
想想这个函数是如何 实现字符串复制的?
23/37
字符串连接
#include <string.h> strcat(目的字符串,源字符串);
字符数组的初始化
用字符型数据对数组进行初始化
– char str[6] = {'C','h','i','n','a','\0'};
C语言全国计算机二级等级考试教程第10章 字符串(章节带习题)

输出时直到遇第一 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!
第十章字符串

One World One Dream
例3. 编写输入文本行函数gettext gettext(char (*t)[LEN],int *m) { int n; printf(“Enter textline,ended to empty line:\n); gets( t[n] ); /*读入1行文本*/ while( *t[n] ) /*不是空行*/ { n++;gets( t[n] ); } *m=n; } 空行 main() { char text[maxline][len]; int n; \0 printf(“%d”, gettext( text, &n)); }
2. 执行语句中赋值(续) (5)用循环赋值
除了可以通过初始化使字符数组各元素得到初值外, 也可以使用getchar()或scanf()函数输入字符。 例如: char str[10]; …… for(i=0; i<10; i++) { scanf("%c", &str[i]); fflush(stdin); /*清除键盘输入缓冲区*/ } ……
1.输入字符串──gets()函数
(1)调用方式:gets(字符数组) (2)函数功能:从标准输入设备(stdin)──键盘上,读 取1个字符串(可以包含空格),回车键读取。并将其存储 到字符数组或字符指针变量中去。 (3)使用说明 1)gets()读取的字符串,其长度没有限制,编程者要保 证字符数组或字符指针变量有足够大的空间,存放输入的字 符串。 2)该函数输入的字符串中允许包含空格,而scanf()函 数不允许。
×把字符串常量赋给一个数组元素?还是越界的。
(4)直接赋值(p143),正确但太罗嗦,一般不采用。
C语言“字符串”

程序运行过程: How do you do?↙ How s=do,s1=you
□do? 注:□代表空格
C语言程序设计教程
第10章 字符串
12
10.1.4 字符串处理函数 C语言库函数中除了前面用到的库函数 gets()与puts()之外,还提供了一些常用的库 函数,其函数在string.h中 1.字符串拷贝函数:strcpy() 调用格式:strcpy(d_str,s_str); 功 能:将以s_str为起始地址的字符串或字 符串常量(连同‘\0’)复制到以d_str为起始地 址的、连续的内存中。 说 明:d_str在内存中所占的字节数应不 小于s_str在内存中所占的字节数。
第10章 字符串
1
第十章 字符串
10.1 字符数组与字符串 10.2 指针与字符串
2013/7/25
C语言程序设计教程
第10章 字符串
2
10.1 字符数组与字符串
10.1.1 字符数组的定义与初始化
1. 字符数组的定义 字符数组:其元素类型为字符类型的数组,其定义与前面介 绍的数组定义相同。 例如: char str[40]; 定义一个有40个元素的字符数组,每个元素相当于一个字 符变量。 char ch[5][30];
15
3.字符串比较函数strcmp()
调用格式:strcmp(str1,str2); 功能:若str1=str2,则函数返回值为0; 若str1>str2,则函数返回值为正整数; 若str1<str2,则函数值返回为负整数。 比较规则: ● 两个字符串自左至右逐个字符比较,直到出现不同字符 或遇到‘\0’为止。 ● 如字符全部相同且字符串的长度相等,则两个字符串相 等; 若出现不同字符,则遇到的第一对不同字符的ASCⅡ大者 为大,返回值为两者ASCII码值之差。 比较两字符串是否相等一般用以下形式: if (strcmp(str1,str2)==0){…}; 而 if(str1==str2){…};是错误的。
第10章 字符串数组(培训)

C语言程序设计
国家等级考试练习 1.有以下程序: main() {char ch[ ]="uvwxyz",*pc; pc=ch; printf("%c\n",*(pc+5)); printf("%c\n",*pc++); printf("%c\n",*pc++); } z 输出结果是: u v
C语言程序设计
C语言程序设计
10.2
使指针指向一个字符串
1 通过赋初值的方式使指针指向一个字符串 char *ps1="form one"; char str[]="form one",*ps2=str; 指针变量中保存的是字符串常量或字符串数组的首地址
C语言程序设计
2 通过赋值运算使指针指向一个字符串 char *ps1; ps1="form one"; char str[ ]="form two",*ps2; ps2=str; 3 用字符数组作为字符串和用指针指向字符串之间 的区别 char mark[ ]="program"; char *pmark[ ]="program";
C语言程序设计
4.以下程序运行后的输出结果是: bcdefgha #include <string.h> char *ss(char *s) { char *p,t; p=s+1; t=*s; while(*p) {*(p-1)=*p; p++; } *(p-1)=t; return s; } main() {char *p ,str[10]="abcdefgh"; p=ss(str); printf("%s\n",p); }
C语言程序设计第10章

√
D)char *s; scanf(“%s”,&s);
练习:设有如下的程序段: char str[]=“Hello”; char *ptr; ptr=str; 执行完上面的程序段后,*(ptr+5)的值是_____。 A)‘o‟ B)‘\0’ √
C)不确定的值
D)‘o‟的地址
10.2.3 用字符数组作为字符串和用指针指向的字符串 之间的区别 p145
10.1.2 在执行语句部分为字符串赋初值 1、在执行语句部分不能直接为字符串赋初值 如:char str[10];
则:str=“abcdef”;
是错误的
2、可用for循环在执行语句给字符串赋初值 如:for (i=0;i<6;i++) str[i]=i+‟a‟; str[6]=„\0‟;
10.2 使指针指向一个字符串 10.2.1 通过赋初值的方式使指针指向一个字符串 如:char str[10]=“abcdef”,*q=str;
10.5 用于字符串处理的函数 1、字符串复制函数strcpy。 1)函数格式:strcpy(s1,s2) 2)函数功能:把s2指向的串复制到s1指向的空间。 3)函数返回值:s1所指地址。
练习:以下程序的输出结果是_____。 #include <stdio.h> #include <string.h> main() { char arr[2][4]; strcpy(arr[0],”you”); strcpy(arr[1],”me”); arr[0][3]=„&‟; printf(“%s\n”,arr); } A)you&me B)you C)me D)err
char *q=“abcdef”;
C语言程序设计(第3版)第10章补充习题及答案

第10章补充习题及答案习题10.1 选择题(1)当已存在一个abc.txt文件时,执行函数fopen("abc.txt","r+")的功能是。
A.打开abc.txt文件,清除原有的内容B.打开abc.txt文件,只能写入新的内容C.打开abc.txt文件,只能读取原有内容D.打开abc.txt文件,可以读取和写入新的内容(2)若用fopen()函数打开一个已存在的文本文件,保留该文件原有内容,且可以读,可以写。
则文件打开模式是。
A."ab+" B."w+" C."a+" D."a"(3)以下不能将文件指针重新移到文件开头位置的函数是。
A.rewind(fp); B.fseek(fp,0,SEEK_SET);C.fseek(fp,-(long)ftell(fp),SEEK_CUR); D.fseek(fp,0,SEEK_END);(4)若用fopen()函数打开一个新二进制文件,该文件可以读也可以写,则文件的打开模式为 B 。
A."ab+" B."wb+" C."rb+" D."a+"(5)fread(buffer,64,2,fp)的功能是。
A.从fp所指的文件中读取64并存入buffer中B.从fp所指的文件中读取64和2并存入buffer中C.从fp所指的文件中读取64个字节的数据并存入buffer中D.从fp所指的文件中读取2个64字节的数据并存入buffer中(6)以下程序的功能是。
提示:PRN是打印设备。
#include <stdio.h>void main(){ FILE * fp;char chStr[]="HELLO";fp=fopen("PRN","w");fputs(chStr,fp);fclose(fp);}A.在屏幕显示HELLO B.把HELLO存入PRN文件中C.在打印机上打印出HELLO D.以上都不对10.2 填空题(1)使用fopen("abc","r+")打开文件时,若"abc"文件不存在,则返回。
计算机二级C语言第10章 字符串

CONTENTS PAGE
计算机二级C语言 第10章 字符串
在C语言中,字符串是借助于字符型一维数组来存放的,并规定以字符‘\0’作为“字符串结 束标志”。‘\0’是一个转义字符,称为“空值”,它的ASCII代码值为0。‘\0’作为标志 占用存储空间,但不计入串的实际长度。
Hale Waihona Puke 下列叙述中正确的是() A.空字符串不占用内存,其内存空间大小是0 B.两个连续的单引号('')是合法的字符常量 C.可以对字符串进行关系运算 D.两个连续的双引号("")是合法的字符串常量
正确答案:C 【解析】fun()函数接收两个字符指针p2、p1,while循环每次将 p1指向的字符赋给p2指向的字符,然后判断p2指向的字符是否是 空字符’\0’,若不是,p1和p2顺序后移一位,直到p1和p2指 向空字符,所以fun()函数的功能是将p1指向的字符串赋值到p2指 向的内存空间中,本题答案为C。
(1)与一般数组一样给一维字符数组赋初值 (2)给一维字符数组赋初值为字符串 (3)执行过程中,不可以用赋值语句给字符数组整体赋一串字符 (4)给数组元素逐个赋字符值,最后人为加入串结束标志
以下选项中,没有编译错误的是( ) A.char str3[] = {'d', 'e', 'b', 'u', 'g', '\0'}; B.char str1[5] = "pass", str2[6]; str2 = str1; C.char name[10]; name = "china"; D.char str4[]; str4 = "hello world";
计算机二级C语言第10章字符串

缓冲区溢出问题
输入数据过长
如果输入的数据超过了缓冲区的大小, 就会发生缓冲区溢出。为了避免这种情 况,应该始终确保输入数据的大小在缓 冲区大小范围内。
VS
字符串操作不当
在处理字符串时,如果使用了不安全的字 符串函数(如strcpy、strcat等),而没 有检查目标缓冲区的大小,就可能导致缓 冲区溢出。为了避免这种情况,应该使用 安全的字符串函数(如strncpy、strncat 等),并始终确保目标缓冲区的大小足够 大。
文件打开与关闭
使用C语言标准库中的文件操作函数,实现 文本文件的打开和关闭。
文本内容读取
通过文件指针和读取函数,逐行或逐字符地 读取文本文件中的内容。
文本内容写入
使用文件指针和写入函数,将字符串或字符 数组中的内容写入到文本文件中。
错误处理与异常检测
在文件读写过程中,添加错误处理和异常检 测机制,确保程序的稳定性和可靠性。
综合案例:简易文本编辑器设计
需求分析
明确简易文本编辑器的功能需求,如打开、保存、编辑、查找、替换 等。
界面设计
使用图形用户界面库(如GTK+、Qt等)设计简易文本编辑器的界面, 包括菜单栏、工具栏、文本编辑区等。
功能实现
根据需求分析,使用C语言和相关库实现简易文本编辑器的各项功能。
测试与优化
对简易文本编辑器进行测试,发现并修复潜在的问题和缺陷,同时优 化程序性能和用户体验。
06
实例分析与编程实践
字符串加密解密程序设计
加密算法设计
通过对字符串中的每个字符进行特定的数学运算或逻 辑操作,实现加密效果。
解密算法设计
根据加密算法的逆过程,将加密后的字符串还原为原 始字符串。
计算机等级考试二级C语言程序设计第10章 字符串-PPT精选文档

4.在C程序执行过程中给字符数组赋字符串 在程序执行过程中,可以通过逐个给数组元素 赋值的方式,给一维字符数组赋字符串。例如: char str[5]; str[0]=’g’; str[1]=’o’; str[2]=’o’; str[3]=’d’; str[4]=’\0’;
10.2 使指针指向一个字符串 10.2.1 通过赋初值的方式使指针指向一个字符串 可以在定义字符指针变量的同时,将存放字符 串的存储单元起始地址赋给指针变量。也可以先 定义一个存放字符串的字符数组,并将数组的首 字地址赋给指针变量。 10.2.2 通过赋值运算使指 针指向一个字符串 若已定义一个字符指针变量,可以通过赋值运 算将某个字符串的起始地址赋给它,从而使其指 向一个具体的字符串
10.2.3 通过赋值运算使指针指向一个字符串 若有以下定义: char array[]="hello!"; char *parray="hello!"; 虽然字符串的内容相同,但它们占有不同的存储 空间。 (1)mark是一个字符数组,通过赋初值,系统为 它开辟了刚好存放以上字符序列再加'\0'的存储空 间(10个字符)。而pmark是一个字符指针,通 过赋初值,使其指向一个字符串常量。 (2)在这个数组内,字符串的内容可以改变,但 array总是引用固定的存储空间,最多只能存放有 6个字符的字符串。
2.字符串常量 C语言中,无字符串数据类型,但允许使用字 符串常量。C语言中,字符串常量给出的是地址 值。不同的字符串具有不同的起始地址。即在C 语言中,字符串常量被隐含处理成一个以‘\0’结 尾的无名字符型一维数组。 3.字符数组与字符串的区别 (1)字符数组的每个元素中可存放一个字符,但 它并不限定最后一个字符应该是什么。
C程序设计 第10章字符串及其操作

10.3.3 字符串的输入输出
2、一次性输入输 出
scanf(" %s ",Str); printf(" %s ",Str);
注意: gets("%s",s); 字符串含有空格、回车或Tab符号,不能用scanf(“%s”,…)读入 puts("%s",s); ,而 gets()可以。 printf (“%s”,…) 遇到字符数组中‘\0’ 停止输出。 输入字符串时要当心,写入的位置是否正确,可能死机。
10.1 引言
字符串是C语言中最有用而且最重要的数据
结构之一。
printf(“Welcome to C programming ”);
其中,传递给函数printf的参数就是一个字符 串。
双引号被用作字符串的边界符号,其中可以
包含除了双引号之外的任何字母、数字以及 特殊字符的任意组合。
如果在字符串中要包含双引号,可用前面所
注意 :字符指针变量string中,仅存储串常量
的地址,而串常量的内容(即字符串本身),是 存储在由系统自动开辟的内存块中,并在串尾添 加一个结束标志’\0’。
10.3.2 字符串与指针
2.整体引用 采取整体引用的办法,改写上例。 【exp10_2】 #include <stdio.h>
10.3.3 字符串的输入输出
声明 char Str[10]; 用于存储字符,最多10个 用于存储字符串,最多9个
为什么?
1、逐个输入输 出
字符数组
for (i=0; i<10; i++) { Str[i]=getcha r();
字符串
for (i=0; i<9; i++) { scanf(" %c ",&Str[i]); printf(" %c ",Str[i]); } Str[i]='\0';
《C语言程序设计》 第10章 字符串

第10章 字符串
str H e l l o
C h i n a \0
pStr char str[] = "Hello China"
char *pStr;
pStr = str;
pStr = &str[0];
pStr的值(指向)可以被修改,它 所指向的字符串也可以被修改
*pStr = 'W';
str[0] = 'W';
char ch, c[80];
第10章 字符串
printf("Input a string:"); gets(c);
printf("%s\n", c); 无需再清空缓冲区
printf("Input a character:"); scanf("%c", &ch); printf("%c\n", ch);
C语言程序设计
23/53
【例】从键盘输入一个人名把它显示在屏幕上
第10章 字符串
#include <stdio.h> #define N 12 int main(void) {
char name[N]; printf("Enter your name:"); scanf("%s", name); printf("Hello %s!\n",name); scanf("%s", name); /* 读取输入缓冲区中余下的上次未被读走的字符 */ printf("Hello %s!\n",name); return 0; }
#include <stdio.h> int main(void) {
第10章之字符串PPT课件

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