《C语言教程》10章 字符数组和字符串

[复制链接]
878|5
 楼主| niuyaliang 发表于 2015-3-17 16:12 | 显示全部楼层 |阅读模式
一、字符数组和字符串的重定义

字符数组就是字符串吗?有人说是,因为书上这么写,教师也这么教的。小雅不敢说书上或教师们错了,但至少可以说许多初学者都混淆了这两个概念。因此,在这此将这2个概念再明确一下。

  • 字符数组,完整地说叫字符类型的数组。字符数组不一定是字符串。
  • 字符串是最后一个字符为NULL字符的字符数组。字符串一定是字符数组。
  • 字符数组的长度是固定的,其中的任何一个字符都可以为NULL字符。
  • 字符串只能以NULL结尾,其后的字符便不属于该字符串。
  • strlen()等字符串函数对字符串完全适用,对不是字符串的字符数组不适用。


 楼主| niuyaliang 发表于 2015-3-17 16:13 | 显示全部楼层
例如下面的例子:

  1. #include <stdio.h>
  2. #include <string.h>

  3. int main(void)
  4. {
  5.     //这是字符数组赋初值的方法
  6.     char cArr[] = {'Q','U','A','N','X','U','E'};
  7.     //这是字符串赋初值的方法
  8.     char sArr[] = "quanxue";

  9.     //用sizeof()求长度
  10.     printf("cArr的长度=%d\n", sizeof(cArr));   //长度为7
  11.     printf("sArr的长度=%d\n", sizeof(sArr));   //长度为8,最后一位是NULL

  12.     //用printf的%s打印内容
  13.     printf("cArr的内容=%s\n", cArr);   //不能正确显示
  14.     printf("sArr的内容=%s\n", sArr);   //可以正确显示

  15.     //用strlen()求长度
  16.     printf("cArr的长度=%d\n", strlen(cArr));   //不正确的结果
  17.     printf("sArr的长度=%d\n", strlen(sArr));   //NULL不在计算范围

  18.     return 0;
  19. }

结果如下:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| niuyaliang 发表于 2015-3-17 16:14 | 显示全部楼层
从上面例子看来,还要注意以下几点:
1.char sArr[] = "quanxue";这种方式,编译时会自动在末尾增加一个NULL字符。
2.NULL字符也就是'\0',在ASCII表中排在第一个,用16进制表示为0x00。
3.sizeof()运算符求的是字符数组的长度,而不是字符串长度。
4.strlen()函数求的是字符串长度,而不是字符数组。它不适用于字符串以外的类型。
5.char sArr[] = "quanxue";也可以写成char sArr[8] = "quanxue";(注意:是8而不是7)
 楼主| niuyaliang 发表于 2015-3-17 16:17 | 显示全部楼层
二、字符串数组
字符串数组是二维字符数组,同样道理,二维字符数组不一定是字符串数组。

  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.     int  i;

  5.     //这是字符数组赋初值的方法,维数:4X2
  6.     char cArr[][2] = {{'Q','U'},
  7.                      {'A','N'},
  8.                      {'X','U'},
  9.                      {'E','\0'}};
  10.     //这是字符串数组赋初值的方法,维数:4X3
  11.     char sArr[][3] = {"qu","an","xu","e"};

  12.     //用sizeof()求长度
  13.     for (i=0; i<4; i++) {
  14.         printf("%d: %d  %d\n", i, sizeof(cArr[i]), sizeof(sArr[i]));
  15.         printf("[%s] [%s]\n", cArr[i], sArr[i]);
  16.     }

  17.     return 0;
  18. }

结果如下:

从上面可以看出,cArr的长度为2,sArr的长度为3,因为多了一个NULL字符。输出cArr时,因为中间没有NULL字符,所以一直显示到有NULL为止。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| niuyaliang 发表于 2015-3-17 16:18 | 显示全部楼层
三、字符数组和字符串数组的转化
字符数组中插入一个NULL字符,NULL字符前面(包括NULL字符)就成了字符串,一般NULL字符插在有效字符的最后。

  1. #include <stdio.h>
  2. #include <string.h>

  3. int main(void)
  4. {
  5.     //因为最后有NULL,所以这就变成了字符串
  6.     char cArr[] = {'Q', 'U', 'A', 'N', 'X', 'U', 'E', '\0'};
  7.     //因为少定义了一位,最后无NULL,所以这就变成了字符数组
  8.     char sArr[7] = "quanxue";
  9.     //最后一个元素未赋值
  10.     char tArr[16] = "www.quanxue.cn";

  11.     //用sizeof()求长度
  12.     printf("cArr: %2d ,%2d\n", strlen(cArr), sizeof(cArr));
  13.     printf("sArr: %2d ,%2d\n", strlen(sArr), sizeof(sArr));
  14.     printf("tArr: %2d ,%2d\n", strlen(tArr), sizeof(tArr));

  15.     //将tArr的最后一个元素赋值,字符串就成了字符数组
  16.     tArr[15] = '!';

  17.     //作为字符数组,将显示16个字符
  18.     for (i=0; i<16; i++) printf("%c", tArr[i]);  //字符数组的显示方法
  19.     //作为字符串,将显示14个字符。
  20.     printf("\n%s\n", tArr);     //字符串的显示方法

  21.     return 0;
  22. }

结果如下:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| niuyaliang 发表于 2015-3-17 16:21 | 显示全部楼层
四、数组的输入输出『gets(),puts()』
getchar()和putchar()函数是单个字符的输入输出,gets()和puts()是字符串的输入输出,也是标准函数,在stdio.h中被定义。
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.     char str[80], *p;

  5.     p = gets(str);
  6.     puts(p);
  7.     puts(str);
  8.     printf("p的地址=%p, str的地址=%p\n", p, str);

  9.     return 0;
  10. }

结果如下:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

212

主题

2427

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部