前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >第一节— —字符函数和字符串函数(没有废话,全是干货)

第一节— —字符函数和字符串函数(没有废话,全是干货)

作者头像
egoist祈
发布2025-01-23 13:12:49
发布2025-01-23 13:12:49
8300
代码可运行
举报
文章被收录于专栏:egoistegoist
运行总次数:0
代码可运行

1.字符分类、转换函数

1.1字符分类函数

C语言中有⼀系列的函数是专门做字符分类的,也就是⼀个字符是属于什么类型的字符的。 这些函数的使用都需要包含⼀个头文件是 ctype.h

以上函数可见 --> C的权威官方网站

例子

写⼀个代码,将字符串中的小写字母转大写,其他字符不变。

代码语言:javascript
代码运行次数:0
复制
#include <stdio.h>
#include <ctype.h>
int main ()
{
	 int i = 0;
	 char str[] = "Test String.\n";
	 char c;
	 while (str[i])
	 {
		 c = str[i];
		 if (islower(c)) 
		 c -= 32;
		 putchar(c);
		 i++;
	 }
 	return 0;
}

1.2字符串转换函数

代码语言:javascript
代码运行次数:0
复制
#include <stdio.h>
#include <ctype.h>
int main ()
{
   	 int i = 0;
	 char str[] = "Test String.\n";
	 char c;
	 while (str[i])
 	 {
 		c = str[i];
	    if (islower(c)) 
 		c = toupper(c);
 		putchar(c);
		i++;
	 }
 return 0;
}

2.strlen的模拟实现

我们已经学会了strlen的使用,但其原理如何却不知道,那么能不能模拟实现strlen呢?

方法1 采用计数器的方式,每次得到一个字符,count++,同时让str往后走。

方法2:递归方式

方法3

3.strcpy、strcnpy函数的使用和模拟实现

3.1strcpy的使用

• 源字符串必须以 ‘\0’ 结束。 • 会将源字符串中的 ‘\0’ 拷贝到目标空间。 • 目标空间必须足够大,以确保能存放源字符串。 • 目标空间必须可修改。

代码语言:javascript
代码运行次数:0
复制
#include<stdio.h>

int main()
{
	char arr1[10]={0};
	char arr2[10]="abcdef";
	strcpy(arr1,arr2);
	printf("%s",arr1);
}

3.2strcpy的模拟实现

明白了strcpy的使用后,我们是否可以自己实现strcpy完成字符串的拷贝呢?

  1. 首先,传过来的地址不能为空,需要断言assert,需要头文件assert.h;
  2. 每次将src的一个字符赋给dest,接着src和dest都需要往后走
代码语言:javascript
代码运行次数:0
复制
char* my_strcpy(char *dest, const char*src)
{ 
	char *ret = dest;
 	assert(dest != NULL);
	assert(src != NULL);
 	while((*dest++ = *src++))
	{
		 ;
 	}
 	return ret;
}

3.3strncpy的使用

这个函数的使用又和strcpy有什么样的联系或区别呢?

第一次接触这个函数可能并不明白这啥意思,如果我们将它与strcpy一起对比。

两个函数都是将source中的字符拷贝到destination这个目标空间,唯独不同的是strncpy可以指定拷贝多少数据

strncpy规则: • 拷贝num个字符从源字符串到目标空间。 • 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。


4.strcat、strncat函数的使用和模拟实现

4.1strcat的使用

• 源字符串必须以 ‘\0’ 结束。 • 目标字符串中也得有 \0 ,否则没办法知道追加从哪里开始。 • 目标空间必须有足够的大,能容纳下源字符串的内容。 • 目标空间必须可修改。

代码语言:javascript
代码运行次数:0
复制
int main()
{
	char arr1[100] = "abcde\0fhij";
	char arr2[] = "xxxxxx";
	strcat(arr1, arr2);//strcat在\0后面追加字母
	printf("%s", arr1);
	return 0;
}
疑问:

我们是否可以让字符串自己给自己追加呢?

4.2strcat的模拟实现

根据strcat的规则: 1. 目标字符串先需要走到\0的地方 2. 接着将源字符串拷贝到目标字符串

代码语言:javascript
代码运行次数:0
复制
char *my_strcat(char *dest, const char*src)
{
	 char *ret = dest;
	 assert(dest != NULL);
	 assert(src != NULL);
	 while(*dest)
	 {
		 dest++;
	 }
	 while((*dest++ = *src++))
	 {
		 ;
	 }
	 return ret;
}

4.3strncat的使用

有了前面的strncpy,我们不难猜测,strncat能够限制追加多少个字符,事实上就是这样。

代码语言:javascript
代码运行次数:0
复制
#include <stdio.h>
#include <string.h>

int main ()
{
	 char str1[20];
	 char str2[20];
	 strcpy (str1,"To be ");
	 strcpy (str2,"or not to be");
	 strncat (str1, str2, 6);
	 printf("%s\n", str1);
	 return 0;
}

5.strcmp、strncmp函数的使用和模拟实现

5.1strcmp的使用

我们前面在qsort函数章节中比较字符串大小时就使用strcmp函数,但是并不知道它的含义及如何使用、模拟实现。

◦ 第⼀个字符串大于第二个字符串,则返回大于0的数字 ◦ 第⼀个字符串等于第二个字符串,则返回0 ◦ 第⼀个字符串小于第二个字符串,则返回小于0的数字 ◦ 那么如何判断两个字符串? 比较两个字符串中对应位置上字符ASCII码值的大小。

5.2 strcmp的模拟实现

  1. 首先,传过来的两个字符串必须是有效的地址,因此需要断言;
  2. *访问地址里的第一个字符,如果两个字符相等,则让其向后走;
  3. 在循环过程中,如果提前走到’\0’处,则返回0(即表示两个字符串相等);
  4. 如果字符不相等,则返回对应的字符的相差值
代码语言:javascript
代码运行次数:0
复制
int my_strcmp (const char * str1, const char * str2)
{
 	 int ret = 0 ;
	 assert(str1 != NULL);
	 assert(str2 != NULL);
	 while(*str1 == *str2)
 	 {
		 if(*str1 == '\0')
			 return 0;
		 str1++;
		 str2++;
	 }
	 return *str1-*str2;
}

5.3strncmp的使用

仿照前面的strncpy和strncat函数,strncmp即限定比较多少个字符。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-01-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.字符分类、转换函数
    • 1.1字符分类函数
      • 例子
    • 1.2字符串转换函数
  • 2.strlen的模拟实现
  • 3.strcpy、strcnpy函数的使用和模拟实现
    • 3.1strcpy的使用
    • 3.2strcpy的模拟实现
    • 3.3strncpy的使用
  • 4.strcat、strncat函数的使用和模拟实现
    • 4.1strcat的使用
      • 疑问:
    • 4.2strcat的模拟实现
    • 4.3strncat的使用
  • 5.strcmp、strncmp函数的使用和模拟实现
    • 5.1strcmp的使用
    • 5.2 strcmp的模拟实现
    • 5.3strncmp的使用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档