在正式介绍字符串之前,我们必须了解c语言中的两个概念,第一个是字符串字面量,第二个是字符常量。举个例子,"a"是字符串字面量,而'a'为字符常量,细心的小伙伴已经看到了,影响他们不同的因素在于头上的引号,单引号为字符常量,双引号为字符串字面量,又叫字符串常量。
在C语言中,为了确定字符串的长度,C编译器自动在字符串的末尾添加了一个ASCII码值为0的空操作符'\0'作为字符串的结束标志,并不作为显式。所以,字符串其实就是由若干有效字符组成且以'字符\0'结束的一个字符序列。
c语言中没有专门给出字符串数据类型,我们在涉及到字符串储存时,往往是借用字符型数组来实现储存,且判断字符型数组是否存储的是一个字符串,则需要看是否以'\0'结束。特殊的是'\0'占用一个字符字节,但不计入字符串的实际长度,却要计入数组长度。这句话再怎么来理解呢?我们看看下面的代码就清楚了:
char str[6]={'H','e','l','l','o','\0'};
我们借助字符型数组定义了一个长度为5的字符串,但是对应数组需要储存6个,否则它不代表一个字符串。
可能有小伙伴见过这样的字符串定义形式:
char str[ ]={'H','e','l','l','o','\0'};
这样的定义直接忽略掉数组的长度,由系统自动分配也是可以的,但如果是下面的就不行
char str[ ]={'H','e','l','l','o'};
可能有小伙伴会产生疑惑,为什么上面的就可以,下面的就不行了,这是因为在字符串定义时,我们一定要强调最后的'\0',否则编译器不会把我们定义的这个字符型数组当作一个字符串处理,也就是必须把'\0'加上,系统才会明白我们存储的是一个以'\0'结束的字符串。
可能有大部分小伙伴都觉得这样定义是不是太繁琐了,有没有更简单的方法,可以让系统自己明白我存储的是一个字符串呢?答案肯定是有的。往下面介绍的定义方法就要设计到第一段说的字符串字面量也就是字符串常量的定义方法了。简单来说就是用双引号。因为字符型是单引号,要区分字符型,我们就引入了双引号的区别办法。如:
char str[ ]={"Hello"};
或者:
char str[ ]="Hello";//推荐理解这种定义,因为最简单
上述的均为存储一个字符串的情况,那么在我们涉及到存储多个字符串的时候,我们采用的是利用二维的字符型数组去存储字符串,如我们要把周一到周日对应的英文(字符串)存到一个二维的字符型数组中去,那我们该怎么写这段代码呢?
char str[7][10]={"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
我们定义了一个7行10列的二维字符型数组,每一行存储了一个字符串,所以用的是双引号,我们来看看这七个字符串在内存中是怎么存储的:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
0 | M | o | n | d | a | y | \0 | \0 | \0 | \0 |
1 | T | u | e | s | d | a | y | \0 | \0 | \0 |
2 | W | e | d | n | e | s | d | a | y | \0 |
3 | T | h | u | r | s | d | a | y | \0 | \0 |
4 | F | r | i | d | a | y | \0 | \0 | \0 | \0 |
5 | S | a | t | u | r | d | a | y | \0 | \0 |
6 | S | u | n | d | a | y | \0 | \0 | \0 | \0 |
可以发现,我们定义的是7行10列,那么每一行都有10列,如果字符串的字符数不够这么多,即没存满的情况,那么系统会自动自动在未满的储存单元中补上字符型'\0'.
接下来,我们深入一点,结合指针知识,了解一下字符串中的字符指针
先明白一个点:字符串字面量(字符串常量)本身代表的就是存放他的常量储存区的首地址,是一个地址常量,如
char *pstr="Hello";
或者
char *pstr;
pstr="Hello";//字符串字面量(字符串常量)本身代表的就是存放他的常量储存区的首地址,指针变量pstr指向的就是字符串Hello的首地址。
这点与之前讲的指针知识有点不同,之前直接指向的地址,这里实际也是指向的地址,但是如果不能明白--字符串字面量(字符串常量)本身代表的就是存放他的常量储存区的首地址--这句话,可能就会一直纠结。
而如果我们要在上述的代码中修改字符串Hello中的任意一个字符,那是做不到的,因为此时字符串hello没有被存储到一个数组当中,他是被保存在只允许被读的常量储存区。如果要修改字符串中的任意字符,我们还需要把其存在字符型数组当中才行,接下来演示一下如何修改字符串中不同位置的字符(修改首位和第二位)
修改第一位:
#include <stdio.h>
#define N 40
int main()
{
char str[]="Hello";
char *pstr=str;
*pstr='w';
printf("%s",str);
}
其结果运行如下:
wello
修改第二位:
#include <stdio.h>
#define N 40
int main()
{
char str[]="Hello";
char *pstr=&str[1];
*pstr='w';
printf("%s",str);
}
其结果运行如下:
Hwllo
只有这样才能成功修改字符串中的任意位置的字符,大家可以去手动敲一下代码。
求盆友们点个赞呀呀呀!