一、字符数组

字符数组定义格式同一般数组,但数组类型使字符型。

字符数组的初始化:

char s1[5]={'a','b,'c','d','e'};    //存单个字符
char s2[6]={'a','b','c','d','e','\0'};  //存字符串,注意虽然只有五个字符,但数组要开到6,因为第六位要存结束符\0
char s[3][4]={"abc","def","ghi"};   //用字符串给二维字符数组初始化,相当于存了三个字符串分别于s[0],s[1],s[2]中

当初始化的元素个数少于数组总个数时,其余位数为空字符。

字符数组中也可以存放若干个字符,也可以来存放字符串。两者的区别是字符串有一结束符( \0 )。反过来说,在一维字符数组中存放着带有结束符的若干个字符称为字符串。字符串是一维数组,但是一维字符数组不等于字符串。

二、字符与字符串的区别

  1. 两者的定界符不同,字符常量由单引号括起来,字符串常量由双引号括起来。
  2. 字符常量只能是单个字符,字符串常量则可以是多个字符。
  3. 可以把一个字符常量赋给一个字符变量,但不能把一个字符串常量赋给一个字符变量。
  4. 字符常量占一个字节,而字符串常量占用字节数等于字符串的字节数加 $ 1 $ 。增加的一个字节中存放字符串结束标志 ‘\0’ 。例如:字符常量 ‘a’ 占一个字节,字符串常量 “a” 占二个字节。

三、字符串输入与输出

Ⅰ. 输入

① 使用 $ scanf $ 读入:

scanf("%s",s1);

scanf("%s%s%s",s1,s2,s3);
输入:a b c
结果:s1='a'    s2='b'     s3='c'

scanf("%s",s1);
输入:a b c
结果:s1='a'    s2=''      s3=''
  1. 这里的字符串名称之前不加 ‘&’ 这个取地址符。
  2. 系统会自动在输入的字符串常量后添加 ‘\0’ 标志,因此输入时,仅输入字符串的内容即可。
  3. 输入多个字符串时,以空格分隔。如果仅有一个输入字符串名称的情况下,字符串变量仅获取空格前的内容。

② 使用 $ gets $ 读入:

gets(s1);   //不能gets(s1,s2);
  1. 使用 $ gets $ 只能输入一个字符串。
  2. 使用 $ gets $ ,是从光标开始的地方读到换行符也就是说读入的是一整行,而使用 $ scanf $ 是从光标开始的地方到空格,如果这一行没有空格,才读到行尾。

Ⅱ. 输出

① 使用 $ printf $ 输出:

printf("$s",s1);
  1. 用 ‘%s’ 格式输出时,$ printf $ 的输出项只能是字符串(字符数组)名称,而不能是数组元素。
  2. 输出字符串不包括字符串结束标志符 ‘\0’ 。

② 使用 $ puts $ 输出:

puts(s1);   //和scanf("%s\n",s1);等价

四、字符串处理函数

函数类型 作用
$ strcat(str1,str2) $ 将$ str2 $ 接到 $ str1 $ 之后,结果返回 $ str1 $
$ strncat(str1,str2,n) $ 将$ str2 $ 的前 $ n $ 个字符接到 $ str1 $ 之后,结果返回 $ str1 $
$ strcpy(str1,str2) $ 将$ str2 $ 赋值给 $ str1 $ ,结果返回 $ str1 $
$ strncpy(str1,str2,n) $ 将$ str2 $ 的前 $ n $ 个字符赋值给 $ str1 $ ,结果返回 $ str1 $
$ strcmp(str1,str2) $ 比较$ str1 $ 和 $ str2 $ 的大小,结果( $ -1,0,1 $ )返回函数本身
$ strncmp(str1,str2,n) $ 比较$ str1 $ 和 $ str2 $ 前 $ n $ 个字符的大小,结果( $ -1,0,1 $ )返回函数本身
$ strlen(str) $ 计算$ str $ 的长度,终止符 $ \text{\0} $ 不算在长度之内,结果返回函数本身
$ strlwr(str) $ 将$ str $ 中的字母全部换为小写
$ strupr(str) $ 将$ str $ 中的字母全部换为大写

使用以上函数,必须包含头文件 $ \color{red} {cstring} $ 。