25-字符串

≡放荡痞女 提交于 2020-04-01 02:05:30

字符串是位于双引号中的字符序列

在内存中以"\0"结束,所占字节比实际多一个 

注意:

(1)可以把一个字符常量赋给一个字符变量,但不能把字符串常量赋给字符变量

(2)C语言中没有字符串变量,可以用字符数组来存放字符串

1、字符数组的概念 

  用来存放字符的数组称为字符数组。

2、字符数组定义

  形式和前边介绍的数值数组相同

  char 数组名[常量表达式]

      例如:char ch[5];

  字符数组也可以是二维或多维数组。

  char 数组名[常量表达式1][常量表达式2];

  例如:char ch[2][5]; 即为二维字符数组。

注意:定义字符数组时,应确保数组长度比字符串长度至少多1

3、字符数组初始化

字符数组也允许在定义时作初始化赋值

char ch[4] = {'a', ' ', 'o'}; 赋值后各元素的值为:

ch[0] = 'a';

ch[1] = ' ';

ch[1] = 'o';

其中ch[3]未赋值,系统自动赋值为0。

当对全体元素赋初值的时候也可以省去长度说明。例如:

  char ch[] = {'f', 'A', ' '};

这时数组长度自动定为3。

注意:未被使用的元素均被自动初始化为0 

4、字符数组的引用

  字符数组和普通数组一样,也是通过下标引用。

5、字符串和字符串结束标志

  在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。

  字符串总是以'\0'作为串的结束符。因此当把一个字符串存入一个数组时,也把结束符'\0'存入数组,并以此作为该字符串是否结束的标志。有了'\0'标志后,就不必再用字符数组的长度来判断字符串的长度了。 

 1 #include <stdio.h>
 2 
 3 int main(int argc, const char * argv[])
 4 {
 5     //这种初始化方式后面必须加上'\0',否则会出现乱码或我们不想要的内容
 6     char ch[] = {'i', 't', 'c', 'a', 's', 't', '\0'};
 7     printf("%s\n", ch);
 8     int len = sizeof(ch)/sizeof(char);
 9     printf("数组长度为%d\n", len);
10     return 0;
11 }

   C语言允许用字符串的方式对数组作初始化赋值。例如: char c[]={'c', ' ','p','r','o','g','r','a','m', '\0'}; 

  可写为: char c[] = {"c program"};  或去掉{}写为: char c[] = "c program";

  用字符串方式赋值比用字符逐个赋值要多占一个字节, 用于存放字符串结束标志'\0'。上面 的数组c在内存中的实际存放情况为: 

'\0'是由C编译系统自动加上的。由于采用了'\0'标志,所以在用字符串赋初值时一般无须指定数组的长度, 而由系统自行处理。 

 

7、字符数组的输入输出

(1)字符串的输出

  在采用字符串方式后,字符数组的输入输出将变得简单方便。

  除了上述用字符串赋初值的办法 外,还可用printf函数和scanf函数一次性输出输入一个字符数组中的字符串,而不必使用循环语句逐个地输入输出每个字符。 

注意在本例的printf函数中,使用的格式字符串为"%s",表示输出的是一个字符串。而在输出表列中给出数组名则可。

不能写为:printf("%s",c[]); 

思考&实现1:

使用 scanf() 从控制台输入一个字符串,然后使用 printf() 将其输出。 

数组长度为100,因此输入的字符串长度必须小于100,以留出一个字节用于存放字符串结束标志 '\0'。 

值得注意的是,对于字符数组,如果不作初始化赋值,则必须说明数组长度。还应该特别注意的是,当用scanf、函数输入字符串时,字符串中不能有空格,否则将以空格作为字符串的结束符。

 

从输出结果可以看出空格以后的字符都未能输出。为了避免这种情况,可多设几个字符数组分段存放含空格的串。程序可改写如下:
 1 #include <stdio.h>
 2 
 3 int main(int argc, const char * argv[])
 4 {
 5     char str1[10], str2[10], str3[10], str4[10];
 6     printf("请输入字符串:\n");
 7     scanf("%s%s%s%s", str1, str2, str3, str4);
 8     printf("你输入的字符串为:%s%s%s%s\n", str1, str2, str3, str4);
 9     return 0;
10 }

这是由于在C语言中规定,数组名就代表了该数组的首地址。整个数组是以首地址开头的一块 连续的内存单元。 

设数组c的首地址为0xffc0,也就是说ch[0]单元地址为oxffc0。则数组名c就代表这个首地址。

因此在ch前面不能再加地址运算符&。如写作scanf("%s",&ch);则是错误的。

在执行函数printf("% s",ch) 时,按数组名c找到首地址,然后逐个输出数组中各个字符直到遇到字符串终止标志'\0'为止。 

8、计算字符串长度

(1)使用字符串处理函数 strlen

 

注意:使用 strlen 计算字符串长度时,不包含'\0'

(2) 使用自定义方法,以'\0'作为字符串结束条件,进行遍历统计

 

9、字符数组和普通数组的区别

实际上,字符数组和普通数组没什么本质区别。

注意的是:数组类型的含义:数组类型指的是数组所包含的元素的的类型,而不是数组名的类型,数组名是一个指针,指向数组第一个元素的地址,即数组的首地址。

字符数组的每个元素都是char类型,整型数组的每个元素都是int类型。

scanf() 和 printf() 函数有一种格式化字符串 %s 可以用来整体输入输出字符数组,但是没 有特定的格式支持 int 数组整体数组输出。 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!