字符串实现
在C语言中,表示一个字符串有以下两种形式:
- 用字符数组存放一个字符串。
- 用字符指针指向一个字符串。
案例
#include <stdio.h>
/**
* 方式1:使用字符数组实现字符串
*/
void str_test1()
{
// 定义一个伪字符串
char str[] = "I Love You";
printf("%s\n",str);
}
/**
* 方式2:使用字符指针实现字符串
*/
void str_test2()
{
// 定义一个伪字符串
char *str = "I Love You";
printf("%s\n",str);
}
int main(int argc,char *argv[])
{
str_test1();
str_test2();
return 0;
}
注意:字符数组和字符指针变量都能实现字符串的存储与运算。(字符指针—> 字符类型的指针变量)
字符数组和字符指针的联系
字符数组由元素组成,每个元素中存放一个字符,而字符指针变量中存放的是地址,也能作为函数参数。
只能对字符数组中的各个元素赋值,而不能用赋值语句对整个字符数组赋值。
char arr[3];
arr[2] = 'A'; // 正确,对字符数组中的元素赋值
arr = {'A','B','C'}; // 错误,(可以理解为数组名就是一个常量,也就是一旦创建,就不能再改变)
字符数组名虽然代表地址,但数组名的值不能改变,因为数组名是常量。
对于字符串中字符的存取,可以用下标法,也可以用指针。
#include <stdio.h>
int main(int argc,char *argv[])
{
// 使用两种方式定义字符串
char str1[] = "你好,张欣!";
char *str2 = "你好,张欣!";// 我们将数据类型为char的指针变量称之为字符指针
// 测试赋值
// str1 = "你好,张鹏!"; // 不能对字符数组整体赋值,如果要赋值,请使用string库下strcpy();
str2 = "你好,张鹏!";
// 打印输出
printf("%s,%s\n",str1,str2);
char a[] = "I Love You!";
char *b = "I Love You!";
// 使用下标法和指针法来访问字符串
printf("%c,%c,%c,%c\n",a[2],*(a+2),b[2],*(b+2));
return 0;
}
字符串作为形式参数
实参与形参都可以是字符数组
void fun(char str[],int len){..}
void main(){
char str[] = "hello";
fun(str,sizeof(str) / sizeof(str[0]));
};
实参用字符数组,形参用字符指针
void fun(char *str,int len){
str[2] = 'A'; // GCC编译环境可通过
}
void main()
{
char str[] = "hello";// 常量池,此时的赋值,将常量池中的数据读取出来,存入到栈中数组对应的位
置
fun(str,sizeof(str) / sizeof(str[0]);
}
实参和形参都是指针变量(在函数内部不能对字符串中的字符做修改)
void fun(char *str,int len){
str[2] = 'A'; // 错误,字符串常量一旦创建,就不能被改变
}
void main()
{
char *str = "hello";
fun(str,sizeof(str) / sizeof(str[0]);
}
实参是指针类型,形参是字符数组(在函数内部不能对字符串中的字符做修改)
void fun(char str[],int len){
str[2] = 'A'; // 错误,字符串常量一旦创建,就不能被改变
}
void main()
{
char *str = "hello";
fun(str,sizeof(str) / sizeof(str[0]);
}
注意:
- 字符数组在创建的时候,会在内存中开辟内存空间,内存空间可以存放字符数据;字符指针在
创建的时候,需要依赖于字符数组,字符指针在内存开辟的内存空间中,存放的是数组元素的
地址。字符指针的创建依赖于字符数组,字符数组可以独立存在,而字符指针不能独立存在。 - 字符数组可以初始化,但是不能赋值;字符指针可以初始化,也可以赋值。
案例
#include <stdio.h>
/**
* 定义一个函数,实现字符串的拷贝,返回字符串长度
* @param source 拷贝的源字符串
* @param target 需要保存拷贝数据的目标字符串
* @return 字符串的大小
*/
int str_copy(char *source,char *target)
{
// 定义一个循环变量
int i = 0;
while(source[i]!='\0')
{
// 实现拷贝
*(target+i) = *(source+i);// 指针法
// target[i] = source[i];// 下标法
i++;
}
// 拷贝结束后,一定要给target末尾加上\0
target[i] = '\0';
return i;
}
int main(int argc,char *argv[])
{
// 定义两个数组,从键盘录入字符串
char source[20],target[20];
printf("请输入一个字符串:\n");
scanf("%s",source);
int len = str_copy(source,target);
printf("%s,%s,%d\n",source,target,len);
return 0;
}
案例
#include <stdio.h>
/**
* 定义一个函数,实现字符串的截取
* @param source 源字符串
* @param start 开始截取的位置
* @param end 截取结束的位置
* @param target 截取后的字符串
* @return 新字符串长度
*/
int str_split(char *source,int start,int end,char *target)
{
// 定义循环变量
int i = 0, k = 0;
// 遍历源字符串(数组)
while(source[i] != '\0')
{
// 根据位置截取
if(i >= start && i < end)
{
// 将截取的字符串存入target "helloworld"
target[k] = source[i];
k++;
}
i++;
}
// 新字符串需要末尾添加\0
target[k] = '\0';
return k;
}
int main(int argc,char *argv[])
{
char *str = "abcdefg";
char target[100];
int len = str_split(str,2,5,target);
printf("%s,%s,%d\n",str,target,len);
return 0;
}