字符串
1. 字符数组和字符串
字符数组:由字符组成的数组,如char word[]={'H', 'e', 'l', 'l', 'o', '!'};
-
- 这个数组由6个字符组成
- 不是C语言的字符串,不能用字符串的方式做计算
字符串:由字符组成的数组,但是数组最后一个元素是 0 或 '\0',如char word[]={'H', 'e', 'l', 'l', 'o', '!', '\0'};
-
- 这个数组由7个字符组成,但是字符串长度为6
- 0 是整数0,4个字节;'\0'是一个字符,1个字节;'0'是ASCII码48
- 不能用运算符+-*/等对字符串做运算
- 可以通过数组的方式对字符串做遍历,C的标准库提供了一系列函数来处理字符串
- 可以用字符串字面量来初始化字符数组

字符串变量:字符串都是字符数组,3种不同的写法:
-
- char *str = "Hello"; //表示指针str指向的字符数组里面放的内容是"Hello",即{'H', 'e', 'l', 'l', 'o', '\0'}
- char word[] = "Hello"; //表示字符数组word里面放的内容是"Hello",即{'H', 'e', 'l', 'l', 'o', '\0'}
- char line[10] = "Hello"; //表示长度为10的字符数组line里面放了6个字符,即{'H', 'e', 'l', 'l', 'o', '\0'},虽然最多能放10个字符,但是只放了6个。但是数组line的长度依旧是10。
字符串常量:即字符串字面量,如"Hello"
-
- "Hello" 会被编译器变成一个字符数组放在某处,这个数组的长度是6,结尾是表示结束的0
- 两个相邻的字符串常量会被编译器自动连接成一个字符串
2. 字符串变量的定义方式
char* s = "Hello, world! "; //对于这句话,有以下说明:
- s 是一个指针,初始化为指向一个字符串常量"Hello, world! "
- 这个字符串常量所在的地方和本地变量不是一处,所以实际上char* s 是 const char* s,这就是《指针》这一节所讲的“所指是const”,即不能通过指针去修改所指的变量的值,相当于只读不写,相当于保护了所指的字符串常量;即s[0] = "B"是会报错的。
- 由于历史原因,编译器接受不带const的写法
- 如果又定义了一个指针char* = "Hello, world! "; 则指针 s 和 p 指向了同一个地方
char s[] = "Hello, world! "; //对于这句话,这个字符串s是可以修改的。
-
- 字符串s作为本地变量,其空间会被自动回收
- 字符串s作为本地变量,其空间会被自动回收
以上两种,选哪种方式来定义字符串呢?

另外,char* 不是一个字符串,是一个指向字符的指针

3. 字符串的输入输出
char str[8]; //定义一个8个元素的字符数组,作为字符串的话最多能放7个字符和最后一个结束标志'\0'
scanf("%s", str); //输入字符作为字符串,遇到输入时空格、tab或回车时停止读入
-
- 这种写法有个问题就是数组越界,str可以容纳8个字符,所以输入字符数小于等于7都没问题,但是个数大于等于8之后就会越界报错
printf("%s\n", str); //输出字符串
scanf("%7s", str); //最多接收7个字符作为字符串,遇到输入时空格、tab或回车时或达到7个字符时自动停止接收,除非后面还有scanf,则由后面的scanf接收。
几个常见错误:
1. char *string; //这只是定义了一个指向字符的指针,此时用scanf("%s", string); 就是错误的
2. 空字符串:char str[100] = ""; 这是一个空字符串,str[0] == '\0',数组str的长度是100
3. 空字符串:char str[] = ""; 这是一个空字符串,str[0] == '\0',数组str的长度是1
4. 字符串数组
char a[][10]={“aaa”, "bb"}; //表示定义了一个数组a,a的每一个元素是一个长度为10的字符串数组。
char *a[]={“aaa”, "bb"}; //表示定义了一个数组a,a的每一个元素是一个指向字符串的指针。
5. 字符串函数
头文件string.h 给了很多字符串函数:strlen、strcmp、strcpy、stract、strchr、strstr
5.1 int putchar(int c); 和 int getchar(void);
听不太明白,视频链接:https://www.bilibili.com/video/BV1XZ4y1S7e1?p=91&vd_source=716f4a1d817b2308c0f0e492c8d315d8
csdn这个这个更明白:一次搞懂getchar()_getchar()_MrWang.的博客-CSDN博客
5.1.1 getchar()原型:
所以char ch; ch = getchar(); 实际上是对getchar()返回的ASCII码的一个类型转换,int转换成char类型。


5.1.2 putchar()
接收一个int类型数据,如果调用时传的实际参数是字符char类型,则char类型被转换成int类型,即该字符的ASCII码,取一个字节即8位,作为要打印
的字符。返回输出字符的ASCII码。

5.2 字符串长度 strlen
size_t strlen(const char *s); //数组通过指针传入,当然数组的名字就是一个指针 。返回s所指向的字符串的长度(数组长度-1)
5.3 两个字符串比较 strcmp

5.4 字符串复制 strcpy

复制之前先申请一个内存空间,用malloc函数:

5.5 字符串搜索
讲得不错,可以再看看https://www.bilibili.com/video/BV1XZ4y1S7e1?p=95&spm_id_from=pageDriver&vd_source=716f4a1d817b2308c0f0e492c8d315d8
字符串中找字符:返回第一次出现的位置的指针,strrchr()是从右边开始找

字符串中找字符串:

一次搞懂getchar()_getchar()_MrWang.的博客-CSDN博客

浙公网安备 33010602011771号