C语言字符串替换:字符,字符串,字符数组详解
案例描述
字符串替换是处理字符串时最常见的操作之一,也是学习字符串必须掌握的知识。本案例要求通过编程实现字符串“Good moring”到“Good evening”的转换。
案例分析
我们需要从字符串中被替换的位置开始,将要替换的内容逐个复制到原字符串中,直到字符串结束或者替换的字符串结束为止。
为了顺利完成案例,需要先学习字符数组,字符串,字符指针等基础知识。
必备知识
1,字符数组
字符数组是存放字符数据的数组,其中每一个元素都是单个字符
(1)字符数组的定义
字符数组定义的语法格式如下:
char 数组名[常量表达式]; char 数组名[常量表达式1][常量表达式2]
在上述语法中,分别列举了定义一维字符数组和二维字符数组的方法。
示例代码如下:
char ch[6];
(2)字符数组的初始化
在数组定义的同时也可以对数组中的元素进行赋值,这个过程称为数组的初始化,示例代码如下:
char c[5] = {'h','e','l','l','o'};
注意
字符数组的初始化很简单,但要注意以下几点。
(1)元素个数不能多于字符数组的大小,否则编译器会出错
(2)如果初始项少于数组长度,则空余元素均会被赋值为空字符(‘\0')
(3)如果没有指定数组大小,则编译器会根据初始项的个数为数组分配长度
(4)也可以初始化二维数组
(和整型数组基本一致)
2,字符串概念
(1)字符串的概念
字符串是由数字、字母、下划线和空格等各种字符组成的一串字符,是个常量,字符串的末尾都默认有一个'\0'作为结束符。
"abcde"
" "
上面这两行都是字符串,只不过第二个字符串中的字符都是空格
字符串在各种编程语言中都是非常重要的数据类型,但是C语言中没有字符串的固定类型,通常用字符数组的形式来存储和处理字符串,这种字符数组必须以'\0'结尾。当把一个字符串存入一个字符数组时,也应把结束符存入数组,因此该字符数组的长度是实际字符数加一。
(2)用字符初始化字符数组
为了便于对字符数组进行初始化操作,可以直接使用一个字符串常量来为另一个字符数组赋值,具体实例如下:
char char_array[6] = {"hello"}; char char_array[] = {"hello"};
(3)获取字符串的长度
字符串用数组来存储,用sizeof运算符来求取各种数据类型的长度,sizeof运算符也可以用来求字符串的长度,例如sizeof(“abcde”)。
除了可以使用sizeof运算符外,还可以使用strlen()函数来获取字符串长度,strlen()函数原型如下:
unsigned int strlen(char *s);
其中s是指向字符串的指针,返回值是字符串的长度。需要注意的是,使用strlen()函数得到的字符串并不包括末尾的空字符'\0'。
sizeof运算符和strlen()函数在求字符串时是有所不同的
两者的区别具体如下:
1,sizeof是运算符,strlen()函数是C语言标准库函数,包含在string.h头文件里
2,sizeof运算符功能是获得所建立对象的字节大小,计算类型所占内存;strlen()函数是获得字符串所占内存的有效字节数。
3,sizeof运算符的参数可以是数组,指针,类型,对象和函数等;strlen()函数的参数必须是指向以'\0'结尾的字符串的指针
4,sizeof运算符计算大小在编译时就完成,因此不能用来计算动态分配内存的大小;strlen()函数结果要在运行时才能计算出来
注意
C语言中的字符串实际上是字符数组,而字符是一种基本数据类型,在字符和字符串之间进行转换是很容易的,接下来,将char a = ‘A'转化为字符串,具体步骤如下:
(1)创建一个长度为2的字符数组:
char a_str[2];
(2)将第一个元素设置为对应的字符,第二个元素设置为空字符
a_str[0] = a; a_str[1] = '\0';
同理将字符串转化为多个字符也很简单,具体示例如下:
char a_str[] = "AB"; char a = a_atr[0]; char b = a_atr[1];
在上述代码中,定义了一个字符数组a_str[],该字符数组中保存的是字符串“AB”。只要将字符串的每个字符赋值给字符变量a,b,就可以完成字符串转化为字符的操作。
3,字符串与指针
在C语言中,字符型指针用char * 来定义,它不仅可以指向一个字符型常量,还可以指向一个字符串。为了描述字符串与指针之间的关系,示例代码如下:
char char_array[] = "hello"; char* ch = char_array;
以上代码,字符指针ch即指向字符‘h'又指向字符串“hello”:如果以“%c"输出,则只输出当前指针指向的字符;如果以“%s”输出,则会输出后面的连续内存空间的数据,直到遇到‘\0'为止。
4,字符数组与字符指针
字符数组与字符指针,也可以取数组地址赋值给字符型指针。字符数组与字符指针围绕字符串有千丝万缕的关系,接下来总结一下两者的区别与联系:
(1)存储方式
字符数组在用字符串初始化时,这个字符串就存放在了字符数组开辟的内存空间中;而字符指针变量在用字符串常量初始化时,指针变量中存储的是字符串的首地址,但字符串存储在常量区。
上面的文字比较晦涩,下面通过一段示例代码来辅助理解,具体如下:
char str[6] = "hello"; char*p = "hello"
上面两行代码中定义的变量在内存区的存储方式如图:
(2)初始化与赋值方式
初始化方式
可以对字符指针变量赋值,但不能对数组名赋值。示例代码如下:
char *p = "hello"; //等价于char *p ;p = "hello"; char str[6] = "hello"; //char atr[6];str = "hello";这种写法错误
赋值方法
使用数组定义的字符串只能通过为数组中的元素逐一赋值或通过调用赋值函数的方式来赋值,而使用指针定义的字符串还可以实现直接赋值。示例代码如下:
char *p1 = "hello" ,*p2; p1 = p2; char str1[6] = "hello" ,str2[6]; //str1 =str2 错误,数组赋值不可行
(3)字符指针与数组名
字符指针变量是可以改变的,而数组名是一个指针常量,其值不可以改变,代码示例如下:
char *p = "hello world"; p += 7; //字符指针变量可以改变
对字符数组char str[6] = "hello"来说,数组名是常量指针,不可改变
(4)字符串中字符的引用
可以用下标法和地址法引用数组元素,同样的,也可以用地址法,指针变量加下标法来引用字符串的字符元素,示例代码如下:
char *p str[100] = "hello world"; char ch1 = str[6]; char *p = "hello world"; char ch2 = p[6]; //等价于char ch2 = *(p + 6)