本章概述思维导图:

字符串
字符串(String) 是计算机科学和编程中的基本数据类型,用于表示由字符组成的序列,通常用来存储和处理文本信息。
字符串的定义:

字符串细节:
1.在底层,实际存储的时候,C语言还是会把字符串"abc"转换成字符数组进行保存,并 且在末尾还要在加上'\ 0';
2.用数组定义时,数组的长度要么不写,如果要写的化,记得要把结束标记的空间给预留出来;
-
字符数组 + 双引号的方式定义字符串,内容是可以发生改变的;
-
利用指针 + 双引号的方式定义字符串,会把底层的字符数组放在只读常量区,内容不可以修改;
只读常量区特点:内容不可以修改,里面定义的字符串是可以复用的;
代码示例第一种定义格式:
cpp
#include <stdio.h>
int main()
{
char arr1[4]="abc";
printf("arr1=%s\n",arr1);
return 0;
}
//代码运行结果:
arr1=abc
代码讲解:定义了一个长度为4的字符数组 arr1
,并用字符串 "abc"
初始化它(编译器会自动在末尾添加一个隐藏的空字符 '\0'
,使数组实际存储为 {'a','b','c','\0'}
),通过 printf
的 %s
格式符输出该字符串。由于数组长度足够容纳3个可见字符和1个结束符,程序能正确打印 ;若数组长度不足(如设为3),则会导致 '\0'
缺失,引发未定义行为(可能打印乱码或崩溃)。
关键点在于:C语言中字符串必须以 '\0'
结尾,且字符数组需预留足够空间。
代码示例第二种定义格式:
cpp
#include <stdio.h>
int main()
{
char *arr2="abc";
printf("arr2=%s\n",arr2);
return 0;
}
//代码运行结果:
arr2=abc
代码讲解:定义了一个字符指针 arr2
并指向字符串字面量 "abc"
(存储在只读内存),通过 printf
的 %s
格式符输出指针指向的字符串内容 abc
;
关键点:在于 arr2
是只读指针(不可修改其指向的字符,否则会引发未定义行为),而字符数组(如 char arr[] = "abc"
)会将字符串拷贝到可修改的栈内存中,因此需根据是否需要修改字符串来选择合适的方式。
代码示例第三种定义格式:
cpp
#include <stdio.h>
int main()
{
char arr3[]={'a','b','c'};
for(int i=0;i<3;i++)
{
printf("%c",arr3[i]);
}
putchar('\n');
return 0;
}
//代码运行结果
abc
代码讲解:这段C代码定义了一个字符数组 arr3
,通过显式初始化 {'a','b','c'}
填充3个字符(无 '\0'
结尾),随后用 for
循环和 printf("%c")
逐个打印字符,最终输出 abc
并换行;
关键点:由于数组未以空字符结尾,它不是合法的C字符串,若误用 %s
格式符会导致未定义行为(如内存越界访问),而当前代码通过 %c
逐字符打印是安全的;若需字符串操作,应改用 char arr[] = "abc"
初始化(自动添加 '\0'
)。
字符串函数
在C语言中,字符串函数是标准库(<string.h>
)提供的用于操作字符串的工具;
字符串函数:strlen( )函数获取字符串的长度

代码示例:
cpp
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[]="abc";
int len1=strlen(arr1);
printf("arr1=%s,长度为:%d",arr1,len1);
return 0;
}
//代码运行结果:
arr1=abc,长度为:3
代码讲解:通过 strlen()
函数计算字符串长度并输出结果:char arr1[] = "abc"
初始化一个以 '\0'
结尾的字符数组,strlen(arr1)
从首地址开始遍历字符直到遇到 '\0'
,返回有效长度3(不包含 '\0'
),最终通过 printf
输出字符串内容 "abc"
和长度 3
。
底层实现strlen函数代码示例:
cpp
int str_len(char arr[])//计算字符串长度函数
{
int i=0;
while(arr[i]!='\0')
{
i++;
}
return i;
}
字符串函数:strcar( )函数拼接两个字符串

在数组1后面接入数组2;
代码示例:
cpp
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[]="abc";
char arr2[]="def";
strcat(arr1,arr2);
printf("arr1=%s\n",arr1,);
return 0;
}
//代码运行结果:
arr1=abcdef
代码讲解:首先定义两个字符数组 arr1
和 arr2
,分别初始化为 "abc"
和 "def"
;随后调用 strcat()函数
,该函数会从 arr1
的 '\0'
位置开始,将 arr2
的内容(包括 '\0'
)追加到 arr1
中,使 arr1
最终变为 "abcdef"
;最后通过 printf
输出 arr1
的内容,结果输出为 :arr1=abcdef
。
底层实现strlen函数代码示例:
cpp
void str_cat(char* arr1,char *arr2)//字符串拼接函数
{
int i=0;
while(arr1[i]!='\0')
{
i++;
}
int j=0;
while(arr2[j]!='\0')
{
arr1[i]=arr2[j];
j++;
i++;
}
arr1[i]='\0';
}
字符串函数:strcpy( )函数复制字符串

把数组2拷贝在数组1中;
代码示例:
cs
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[]="abc";
char arr2[]="def";
strcpy(arr1,arr2);
printf("arr1=%s\n",arr1);
return 0;
}
//代码运行结果:
arr1=def;
代码讲解:首先定义两个字符数组 arr1
和 arr2
,分别初始化为 "abc"
和 "def"
;随后使用 strcpy
函数将字符串 "def"
(包括终止符 '\0'
)从 arr2
复制到 arr1
,覆盖了 arr1
原有的 "abc"
,最终 arr1
的内容变为 "def"
并正确输出;
底层实现strcpy函数代码示例:
cs
void str_cpy(char* arr1,char *arr2)//字符串复制函数
{
int i=0;
while(arr2[i]!='\0')
{
arr1[i]=arr2[i];
i++;
}
arr1[i]='\0';
}
字符串函数:strcmp( )函数比较两个字符串

返回值为:相同放回值为0;不相同返回值非零数;
代码示例:
cpp
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[]="abc";
char arr2[]="def";
int num1=strcmp(arr1,arr2);
printf("arr1和arr2是否相同(相同为0不同为非0数):%d\n",num1);
return 0;
}
//代码运行结果:
arr1和arr2是否相同(相同为0不同为非0数):-3
代码讲解:首先定义两个字符数组 arr1
和 arr2
,分别初始化为 "abc"
和 "def"
;随后使用strcmp
比较了两个字符串 "abc"
和 "def"
的字典序:strcmp
会逐字符对比它们的 ASCII 码值,先比较 'a'
(97)和 'd'
(100),因 97 < 100
直接返回负数(通常为 -1
),最终输出结果为非零值,表明两字符串不同;其核心逻辑是通过遍历字符直到遇到差异或终止符 '\0'
,返回第一个不同字符的 ASCII 差值,若完全相同则返回 0
,需注意返回值仅表示大小关系而非固定为 1
或 -1;
底层实现strcmp函数代码示例:
cpp
int str_cmp(char *arr1,char *arr2)//字符串比较函数
{
int i=0;
while(arr1[i]!='\0' && arr2[i]!='\0')
{
if(arr1[i] ==arr2[i])
{
i++;
}
else
{
return 1;
}
}
return 0;
}
字符串函数:strlwr( )函数将字符串变成小写

把字符串里的大写字母转换为小写字母
代码示例:
cpp
#include <stdio.h>
#include <string.h>
void str_lwr(char arr1[])
{
int i=0;
while(arr1[i]!='0')
{
if(arr1[i]>='A' && arr1[i]<='Z')
{
arr1[i]=arr1[i]+32;
}
i++;
}
arr1[i]='\0';
};
int main()
{
char arr1[]="ABC";
strlwr(arr1);
printf("arr1=%s\n",arr1);
return 0;
}
//代码运行结果:
arr1=abc
代码讲解:首先定义一个字符数组 arr1
,初始化为 "abc";
通过 strlwr
函数将字符串 "ABC"
转换为小写并输出 ;
底层实现strlwr函数代码示例:
cpp
void str_lwr(char arr1[])
{
int i=0;
while(arr1[i]!='0')
{
if(arr1[i]>='A' && arr1[i]<='Z')
{
arr1[i]=arr1[i]+32;
}
i++;
}
arr1[i]='\0';
}
字符串函数:strupr( )函数将字符串变成大写

把字符串里的小写字母转换为大写字母
代码示例:
cpp
#include <stdio.h>
#include <string.h>
void str_upr(char arr1[])
{
int i=0;
while(arr1[i]!='0')
{
if(arr1[i]>='a' && arr1[i]<='z')
{
arr1[i]=arr1[i]-32;
}
i++;
}
arr1[i]='\0';
};
int main()
{
char arr1[]="abc";
str_upr(arr1);
printf("arr1=%s\n",arr1);
return 0;
}
//代码运行结果:
arr1=ABC
代码讲解:首先定义一个字符数组 arr1
,初始化为 "abc";
通过 strlwr
函数将字符串 "abc"
转换为大写并输出 ;
底层实现strlwr函数代码示例:
cpp
void str_upr(char arr1[])
{
int i=0;
while(arr1[i]!='0')
{
if(arr1[i]>='a' && arr1[i]<='z')
{
arr1[i]=arr1[i]-32;
}
i++;
}
arr1[i]='\0';
}
字符串练习题
通过本章的学习,接下来就是进入实战环节,小伙伴们开始攻略C语言字符串练习题啦!小伙伴们先尝试自己敲代码敲完后在来查看代码示例呦!
字符串(遍历字符串)
题目:键盘录入一个字符串,使用程序实现在控制台遍历该字符串
代码示例:
cpp
#include <stdio.h>
#define max 100
void arr_bianli(char *arr);
int main()
{
char arr[max];
arr_bianli(arr);
return 0;
}
void arr_bianli(char *arr)
{
printf("输入字符实现遍历\n");
scanf("%s",arr);
printf("arr=%s\n",arr);
}
字符串(大小写转换)
题目:键盘录入一个字符串数组arr1,实现大小写转换
代码示例:
cs
#include <stdio.h>
#include <string.h>
void str_upr(char arr1[])
{
int i=0;
while(arr1[i]!='0')
{
if(arr1[i]>='a' && arr1[i]<='z')
{
arr1[i]=arr1[i]-32;
}
i++;
}
arr1[i]='\0';
};
void str_lwr(char arr1[],int len1)
{
for(int i=0;i<len1;i++)
{
if(arr1[i]>='A' && arr1[i]<='Z')
{
arr1[i]=arr1[i]+32;
}
}
arr1[len1]='\0';
};
int main()
{
char arr1[];
printf("开始赋值\n");
scanf("%s",arr1);
str_upr(arr1);
str_lwr(arr1);
printf("arr1=%s\n",arr1);
return 0;
}
字符串(拷贝)
题目:有两个字符串arr1和arr2,分别赋值为myy和lyf,使其arr1赋值arr2的内容;
代码示例:
cs
#include <stdio.h>
#include <string.h>
void str_cpy(char* arr1,char *arr2);//字符串复制函数
int main()
{
char arr1[]="myy";
char arr2[]="lyf";
str_cpy(arr1,arr2);
printf("arr1=%s\n",arr1);
return 0;
}
void str_cpy(char* arr1,char *arr2)//字符串复制函数
{
int i=0;
while(arr2[i]!='\0')
{
arr1[i]=arr2[i];
i++;
}
arr1[i]='\0';
}
字符串(拼接)
题目:有两个字符串arr1和arr2,分别赋值为"我们"和"爱编程",使其arr1拼接arr2的内容;
代码示例:
cpp
#include <stdio.h>
#include <string.h>
void str_cat(char* arr1,char *arr2);//字符串拼接函数
int main()
{
char arr1[]="我们";
char arr2[]="爱编程";
str_cat(arr1,arr2);
printf("arr1=%s\n",arr1);
return 0;
}
void str_cat(char* arr1,char *arr2)//字符串拼接函数
{
int i=0;
while(arr1[i]!='\0')
{
i++;
}
int j=0;
while(arr2[j]!='\0')
{
arr1[i]=arr2[j];
j++;
i++;
}
arr1[i]='\0';
}
制作不易!喜欢的小伙伴给个小赞赞!喜欢我的小伙伴点个关注!有不懂的地方和需要的资源随时问我哟!