有时候会把字符数组当成字符串,其实字符串是一个新的概念,字符串不是字符数组。
接下来我来介绍字符串是什么
以{ }形式定义
- 字符数组:char word[ ] = {‘H’,‘e’,‘l’,‘l’,‘o’,‘!’};
- 字符串:char word[ ] = {‘H’,‘e’,‘l’,‘l’,‘o’,‘!’,‘ ’};
- 字符串的输入输出:用%s(字符串);%c(单个字符)
scanf读入一个单词(到空格、tap或回车为止)
注意:
- 字符串都是有’ ’的, 以0(整数0)结尾的一串字符
0或' '是一样的,但是和’0’不同
0标志字符串的结束,但他不是字符串的一部分
计算字符串长度的时候不包含这个0 - 字符串以数组的形式存在,以数组或指针的形式访问
更多的是以指针的形式(数组和指针有着某种关联,在《指针C语言》里有介绍)
string.h里有很多处理字符串的函数
字符串也可以用两个" "来定义;" "之间的就是字符串
- char *str = “Hello”; <==> 指针字符串
- char word[ ] = “Hello”; <==> 数组字符串
- char line[10] = “Hello”; <==> 数组字符串
这样定义更方便、简介;而且编译器会自动帮你在数组里加上' ';字符串都是有' '结尾的,就像上面说的它不属于字符串长度。
- 就拿char word[ ] = “Hello”; 为例:字符串长度为5,而数组长度是6,因为还有结尾的' ',感觉是不是比用{ }定义好很多。
- char word[ ] = {‘H’,‘e’,‘l’,‘l’,‘o’,‘!’,‘ ’}; <==> char word[ ] = “Hello”;
两个相邻的字符串常量会被自动连接起来 “或者633”“599结束”<==>“或者633599结束”
- 指针字符串:char* s = “Hello,world!”; s是指针,它指向一个字符串常量,常量所在的地方不接受修改。
- 如果需要修改字符串,应用数组字符串:char s[ ] = “Hello,world!”;
- 从地址上看:s与s2它俩指向一个同字符串常量,常量所在的地方不接受修改。
- 从字符串上看:s2与s3都输出了字符串'Hello',但只有s3可以修改,因为s3是创造出来的一个字符串,而s与s2都是指向本身就存在的一个字符串常量,这种常量不接收修改。
- 同时可看出数组也可输出地址和指针相似(数组变量是特殊的指针)
推荐:
- 如果要构造一个字符串——>数组字符串
- 如果要处理一个字符串——>指针字符串
- 字符串数组:char **a <==> a是一个指针,指向另一个指针,那个指针指向一个字符(串)
- char a[ ][ ](得给出明确的列)<==> 二维数组
- char *a[ ] = { "holle","world","li" } <==> 好多指针a[0]指向"hello" a[1]指向"world" a[2]指向"li"
有许多适用于字符串的函数;运用需要有头文件#include
字符串函数:#include
- strcpy(s1, s2); <==> 复制字符串 s2 到字符串 s1。
- strcat(s1, s2); <==> 连接字符串 s2 到字符串 s1 的末尾。
- strlen(s1); <==> 返回字符串 s1 的长度。
strcmp(s1, s2); <==> 如果 s1 和 s2 是相同的,则返回 0;如果 s1- 如果 s1>s2 则返回大于 0。 - strchr(s1, ch); <==> 返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。
- strstr(s1, s2); <==> 返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。



