有时候会把字符数组当成字符串,其实字符串是一个新的概念,字符串不是字符数组。
接下来我来介绍字符串是什么
字符串定义:
以{ }形式定义
- 字符数组:char word[ ] = {‘H’,‘e’,‘l’,‘l’,‘o’,‘!’};
- 字符串:char word[ ] = {‘H’,‘e’,‘l’,‘l’,‘o’,‘!’,‘\0’};
- 字符串的输入输出:用%s(字符串);%c(单个字符)
scanf读入一个单词(到空格、tap或回车为止)
注意:
- 字符串都是有’\0’的, 以0(整数0)结尾的一串字符
0或'\0'
是一样的,但是和’0’不同
0标志字符串的结束,但他不是字符串的一部分
计算字符串长度的时候不包含这个0 - 字符串以数组的形式存在,以数组或指针的形式访问
更多的是以指针的形式(数组和指针有着某种关联,在《指针C语言》里有介绍)
string.h里有很多处理字符串的函数
字符串变量
字符串也可以用两个"
"
来定义;"
"
之间的就是字符串
- char *str = “Hello”; <==> 指针字符串
- char word[ ] = “Hello”; <==> 数组字符串
- char line[10] = “Hello”; <==> 数组字符串
这样定义更方便、简介;而且编译器会自动帮你在数组里加上'\0'
;字符串都是有'\0'
结尾的,就像上面说的它不属于字符串长度。
- 就拿char word[ ] = “Hello”; 为例:字符串长度为5,而数组长度是6,因为还有结尾的
'\0'
,感觉是不是比用{ }定义好很多。 - char word[ ] = {‘H’,‘e’,‘l’,‘l’,‘o’,‘!’,‘\0’}; <==> 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 <string.h>
字符串函数:#include <string.h>
strcpy(s1, s2); <==> 复制字符串 s2 到字符串 s1。
strcat(s1, s2); <==> 连接字符串 s2 到字符串 s1 的末尾。
strlen(s1); <==> 返回字符串 s1 的长度。
strcmp(s1, s2); <==> 如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回小于 0; >- 如果 s1>s2 则返回大于 0。
strchr(s1, ch); <==> 返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。
strstr(s1, s2); <==> 返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。