C语言-字符串(定义)、字符串函数(strlen、strcat、strcpy、strcmp、strlwr、strupr)

本章概述思维导图:

字符串

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

字符串的定义:

字符串细节:

1.在底层,实际存储的时候,C语言还是会把字符串"abc"转换成字符数组进行保存,并 且在末尾还要在加上'\ 0';

2.用数组定义时,数组的长度要么不写,如果要写的化,记得要把结束标记的空间给预留出来;

  1. 字符数组 + 双引号的方式定义字符串,内容是可以发生改变的;

  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

代码讲解:首先定义两个字符数组 arr1arr2,分别初始化为 "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;

代码讲解:首先定义两个字符数组 arr1arr2,分别初始化为 "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

代码讲解:首先定义两个字符数组 arr1arr2,分别初始化为 "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';
}

制作不易!喜欢的小伙伴给个小赞赞!喜欢我的小伙伴点个关注!有不懂的地方和需要的资源随时问我哟!

相关推荐
R-G-B7 分钟前
【33】C# WinForm入门到精通 ——表格布局器TableLayoutPanel【属性、方法、事件、实例、源码】
开发语言·c#·c# winform·表格布局器·tablelayoutpane
郝学胜-神的一滴25 分钟前
Spring Boot Actuator 保姆级教程
java·开发语言·spring boot·后端·程序人生
赵英英俊33 分钟前
Python day31
开发语言·python
@珍惜一生@44 分钟前
xerces-c-src_2_8_0 arm_linux编译
linux·c语言·arm开发
Tisfy1 小时前
LeetCode 2411.按位或最大的最小子数组长度:一次倒序遍历
数据结构·算法·leetcode·题解·位运算·遍历
程序员-Queen1 小时前
RDQS_c和RDQS_t的作用及区别
c语言·开发语言
2202_756749691 小时前
04 基于sklearn的机械学习-梯度下降(上)
人工智能·算法·机器学习
草莓爱芒果1 小时前
Spring Boot中使用Bouncy Castle实现SM2国密算法(与前端JS加密交互)
java·spring boot·算法
晚云与城2 小时前
【数据结构】-----排序的艺术画卷
数据结构·算法·排序算法