第 10章 字符串
10.1 用一个一维字符数组来存放字符串
10.2 使指针指向一个字符串
10.3 字符串的输入和输出
10.4 字符串数组
10.5 用于字符串处理的函数
10.6 程序举例
10.1 用一个一维字符数组来存放字符串一、字符串及其存储方法:
1,定义:字符串是指若干有效字符的序列 。
★ 有效字符:是指系统允许使用的字符,包括字母,数字,专用字符,转义字符等 。
例:,China”,“a+b=c”,“%d\n”;
C语言规定:以 ‘ \0?字符作为字符串的结束标志 。 ‘ \0?的 ASCII码为 0,称为,空值,。
注意:在 C语言中,没有字符串变量;
字符串是存放在一个字符型数组中 。
字符串常量不需在其末尾加 ‘ \0?,并被处理成以 ‘ \0?结尾的无名字符型一维数组 。
2、字符串在字符数组中的存储方式:
( 1) 单个元素赋值的方法;
( 2) 字符串的整体处理 。
3,字符串的存储方式示意图:
4,字符串与字符数组的关系:
★ 字符串存放在字符数组中,但字符数组和字符串可以不等长;
★ 字符串以,\0”作为结束标记 。
Ch
i
an
C[1]
C[2]
C[0]
C[4]
C[6]
C[3]
C[5]
C[7]
Ch
i
an
C[1]
C[2]
C[0]
C[4]
C[6]
C[3]
C[5]
C[7]
\0
10.1.1 通过赋初值的方式给一维字符数组赋字符串
1,逐个地为数组中各元素指定初值字符 。
char c[]={?C?,?h?,?i?,?n?,?a?,?\0?};
2,对一个字符数组指定一个字符串初值 。
char c[]={“China”};
char c[13]=“Computer & C”;
注意,( 1) 系统会自动在最后一个字符后面加一 ‘ \0?作为结束标记 。
( 2) 字符数组的长度至少应为字符的个数加 1。
10.1.2 在 C程序执行过程中给一维字符数组赋字符串
1,不可以用赋值语句给字符数组整体赋一串字符因为数组名是一个地址常量,不可重新赋值 。
2,给数组元素逐个赋字符值,最后人为加入串结束标志 ‘ \0?。
例,char mark[10];
int i;
for(i=0 ;i<9;i++)
scanf(“%c”,&mark[i]);
mark[i]=?\0?;
10.2 使指针指向一个字符串
1、字符串是存放在字符数组中的,因此可通过指针来访问:
用字符指针指向一个字符串注意,( 1)可以不定义数组,而直接用一个指针变量指向一个字符串常量。
例,char *p=“C Language”;
( 2) p是指向字符串的地址,是一指针变量,只能说将字符串的地址赋给 p;而不能说将字符串中的字符赋给了 p。
( 3)字符串指针在未赋值以前,其指向是不确定的。
2,用字符数组作为字符串和用指针指向的一个字符串的区别见 P146图示
10.3 字符串的输入和输出一、字符串的输入:
1,逐个地为数组中各元素输入值 。
char str[9];
scanf(“%c”,&str[0]);
2,对一个字符数组一次输入一个串值 。
char str[9];
scanf(“%s”,str);
注意,( 1) 数组名本身就代表地址 。
( 2) 系统会自动加上一个结束标记,\0”。
( 3) 字符串以空格和回车作为结束标记 。
3、专门的字符串输入函数 gets(str):
char str[9];
gets(str); /* 只以回车作结束标记 */
二,字符串的输出:
1,格式化输出函数 printf():
char str[9];
printf(“%s,%c”,str,str[0]);
注意,( 1) 输出元素时,要带下标 ( %c);
( 2) 输出串时只要用数组名 ( %s)即可;
( 3) 输出时不包括,\0”。
( 4) 字符串中,\0”以后的字符不予输出 。
2,字符串输出函数 puts(str):
例,puts(str);
10.4 字符串数组
1维字符数组,用于存储和处理 1个字符串,其定义格式与 1维数值数组一样 。
2维字符数组,用于同时存储和处理多个字符串,其定义格式与 2维数值数组一样 。
10.5 用于字符串处理的函数
1,字符串拷贝函数 strcpy():
语法格式,strcpy(str,”字符串常量,);
注意,
( 1) C语言中不允许用赋值表达式对字符数组赋值 ;
( 2) 字符串结束标记,\0”一起被复制到一个新串中;
( 3)可以将一个字符数组中的一个字符串复制到另一个字符数组中。
2、字符串连接函数 strcat():
语法格式,strcat(str1,str2);
注意,字符串 1(str1)要定义的足够大 。
3、字符串比较函数 strcmp(),
语法格式,strcmp(str1,str2);
注意,( 1) str1>str2,函数值为正;
( 2) str1=str2,函数值为 0;
( 3) str1<str1,函数值为负 。
4,测字符串长度函数 strlen():
语法格式,strlen(str);
注意,该函数值为,\0”之前的全部字符的个数。
总结一,字符数组的定义类型名 数组名 大小
1,初始化,
直接给出字符串中的各字符
char a[5]={' G ',' o ',' o ',' d '};
字符串 –––用字符数组存放。
char c[10];
若字符多于元素个数,则语法错,反之,后而补 "\0"
可以去掉定义时的大小设置,而通过自动赋值决定 长度 (大小 )
char x[ ]={' I ',' ',' a ',' m ',' ','a',' ',' s ',' t ',' u ',
' d ',' e ',' n ',' t ',',','\0 '};
前面说过,字符串常量用,” 表示,且由‘ \0’
结尾,
static char x[ ]={"I am a student,"};
则长度为 15+1=16,其中 x[15]存放‘ \0’,其中 { }
亦可省略。2,字符数组的引用每一个字符数组元素相当于一个字符变量。
格式符,%c –––逐个输入 /输出字符。
%s ––– 整个串一次输入 /输出。
1,输出 (用 %s)
用 %s输出时,不输出‘ \0’.
在 printf中须直接写数组名,
char c[ ]={"I am a student"};
printf("%s",c);
二,字符数组的输入输出
若数组长度大于字符串长度,则遇到‘ \0’
即停止输出
char c[10]=" china";
printf(" %s",c);
输出时遇到第一个‘ \0’即结束。
2,输入 (用 %s)
输入多个字符串,可用空格隔开。
char str1[5],str2[5],str3[5];
scanf(" %s%s%s",str1,str2,str3);
输入字符串时,系统自动加上‘ \0’
则,输入 How are you
str1,H o w \0
str2,a r e \0
str3,y o u?\0
输入,How are you?则只会将 How输入,且存为
scanf中须用地址量,数组名表示地址量。
str,H o w \0 ……
但若,char str[13]
scanf("%s",str);
字符串数组举例例,输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。
程序如下:
# include "stdio.h"
main ( )
{
char string[81];
int i,num=0,word=0;
char c;
gets (string);
for (i=0; (c=string[i])!= '\0 '; i++)
if ( c= = ' ')word=0;
else if (word = =0)
{
word=1;
num++;
}
printf("There are %d words in the line \n ",num);
}
运行情况如下:
I am a boy.?
There are 4 words in the line