前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言:字符函数和字符串函数

C语言:字符函数和字符串函数

作者头像
P_M_P
发布2024-01-18 19:02:39
1110
发布2024-01-18 19:02:39
举报
文章被收录于专栏:C语言P_M_P学习笔记C语言

1.字符分类函数

C语言中有一系列函数是用来做字符分类的,判断一个字符属于什么类型。这些函数的使用需要包含头文件ctype.h

以上函数的参数如果符合右侧条件则返回真。

islower 是能够判断参数部分是否是⼩写字⺟的。 通过返回值来说明是否是⼩写字⺟,如果是⼩写字⺟就返回⾮0的整数,如果不是⼩写字⺟,则返回0。

使用代码演示如下:

代码语言:javascript
复制
//判断是否是小写字母
#include<stdio.h>
#include<ctype.h>
int main()
{
	char a = 'a';
	char B = 'B';
	int ret_a = islower(a);
	int ret_B = islower(B);
	printf("%d %d", ret_a, ret_B);
	return 0;
}

2.字符转换函数

tolower

将大写字母转换为小写字母

toupper

将小写字母转换为大写字母

我们以小写字母转大写字母为例:

代码语言:javascript
复制
//toupper
#include<stdio.h>
#include<ctype.h>
int main()
{
	char a = 'a';
	char A = toupper(a);
	printf("%c", A);


	return 0;
}

下面将谈到字符串函数

3.strlen的使用和模拟实现

代码语言:javascript
复制
size_t strlen ( const char * str )

注意:

·字符串以'\0'作为结束标志,strlen函数返回的是在字符串中'\0'前面出现的字符个数(不包含'\0')

·参数指向的字符串必须以'\0'结束

·注意函数的返回值为size_t,是⽆符号的( 易错 )

strlen函数的模拟实现

代码语言:javascript
复制
//1----递归
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* str)
{
	assert(str);
	if (*str != '\0')
	{
		
		return 1+my_strlen(str + 1);
	}
	else
		return 0;
}

size_t my_strlen(const char* str)
{
	int count = 0;
	assert(str);
	while (*str != '\0')
	{
		count++;
		str++;//改变了指针,不是很好
	}
	return count;
}

//2----指针-指针
size_t my_strlen(const char* str)
{
	char* ret=str;
	while (*ret != '\0')
	{
		ret++;
	}
	return ret - str;

}
int main()
{
	char arr[10] = "hello";
	size_t len = my_strlen(arr);
	printf("%zd", len);
	return 0;
}

4.strcpy的使用和模拟实现

代码语言:javascript
复制
char * strcpy ( char * destination, const char * source )

注意:

·源字符串必须以'\0'结束

·最后会将源字符串的'\0'拷贝到目标空间

·目标指向的数组不应在内存中与重叠

·目标空间必须足够大,确保能放下源字符串

·目标空间必须可变

strlcpy函数的模拟实现

代码语言:javascript
复制
//strcpy模拟实现
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* destination, const char* source)
{
	char* ret = destination;
	assert(destination);
	assert(source);
	while (*destination++ = *source++)
	{
		;
	}
	return ret;//传目标字符串首元素地址
}
int main()
{
	char arr1[20] = "hello";
	char arr2[20]={ 0 };
	printf("%s", my_strcpy(arr2, arr1));
	return 0;
}

5.strcat的使用和模拟实现

代码语言:javascript
复制
char * strcat ( char * destination, const char * source )

注意:

·源字符串必须以'\0'结束

·目标字符串中也必须有'\0'

·目标空间必须足够大,能容纳下源字符串内容

·目标空间必须可修改

strcat函数的模拟实现

代码语言:javascript
复制
#include<stdio.h>
#include<assert.h>
char* my_strcat(char* destination, const char* source)
{
	char* ret = destination;
	assert(destination);
	assert(source);
	while (*destination != '\0')
	{
		destination++;
	}
	while (*destination++ = *source++)
	{
		;
	}

	return ret;
}
int main()
{
	char arr1[20] = "hello ";
	char arr2[20] = "world";
	printf("%s", my_strcat(arr1, arr2));
	return 0;
}

6.strcmp的使用和模拟实现

代码语言:javascript
复制
int strcmp ( const char * str1, const char * str2 )

·标准规定:

·第一个字符串大于第二个字符串,则返回大于0的数字

·第一个字符串等于第二个字符串,则返回0

·第一个字符串小于第二个字符串,则返回小于0的数字

·通过比较两个字符串对应位置上字符的ASCII码值的大小来决定返回值

strcmp函数的模拟实现

代码语言:javascript
复制
//strcmp函数的模拟实现
#include<stdio.h>
#include<assert.h>
int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
		{
			return 0;
		}
			str1++;
			str2++;
	}
	return *str1 - *str2;

}
int main()
{
	char arr1[10] = "world";
	char arr2[10] = "word";
	int ret = my_strcmp(arr1, arr2);
	printf("%d", ret);

	return 0;
}

7.strncpy函数的使用

代码语言:javascript
复制
char * strncpy ( char * destination, const char * source, size_t num )

注意:

·从源字符串拷贝num个字符到目标空间

·如果源字符串长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个

·与strcpy的不同在于,strncpy限制了拷贝的字符数,更加安全

8.strncat的使用

代码语言:javascript
复制
char * strncat ( char * destination, const char * source, size_t num )
代码语言:javascript
复制
#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", str1);
	return 0;
}

9.strncmp函数的使用

代码语言:javascript
复制
int strncmp ( const char * str1, const char * str2, size_t num )

注意:

·比较str1和str2的前num个字符,如果相等就继续往后比较,最多比较num个字符,如果提前发现不一样,就提前结束,大的字符所在的字符串大于另外一个。如果num个字符都相等,就返回0。

代码语言:javascript
复制
#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[10] = "world";
	char arr2[10] = "word";
	int ret = strncmp(arr1, arr2, 3);
	int r = strncmp(arr1, arr2, 4);
	printf("%d\n%d", ret, r);

	return 0;
}

10.strstr的使用和模拟实现

代码语言:javascript
复制
const char * strstr ( const char * str1, const char * str2 );
      char * strstr (       char * str1, const char * str2 );

返回指向 str2 中第一次出现的 str1 的指针,如果 str2 不是 str1 的一部分,则返回一个空指针。

如果str2是空字符串,则直接返回str1。

代码语言:javascript
复制
/* strstr example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] ="This is a simple string";
  char * pch;
  pch = strstr (str,"simple");
  if (pch != NULL)
    strncpy (pch,"sample",6);
  puts (str);
  return 0;
}

strstr的模拟实现

代码语言:javascript
复制
#include<stdio.h>
#include<string.h>
const char* my_strstr(const char* str1, const char* str2)
{
	const char* s1 = str1;
	const char* s2 = str2;
	const char* p = str1;
	if (! *str2)
	{
		return str1;
	}
	while (*p)
	{
		s1 = p;
		s2 = str2;
		while (*s1 && *s2&&!(*s1-*s2))//s1,s2遇到\0停止,*s1和*s2不同也停止
		{
			s1++;
			s2++;
		}
		if (!*s2)//遇到\0
			return p;
		p++;//没找到,可能的初始位置++
	}
	return NULL;
}
int main()
{
	char arr1[] = "abbcdefg";
	char arr2[] = "bcd";
	char* cp=my_strstr(arr1, arr2);
	strncpy(cp, "lll",3);
	printf("%s", arr1);
	return 0;
}

11.strtok函数的使用

代码语言:javascript
复制
char * strtok ( char * str, const char * delimiters )

• delimiters参数指向⼀个字符串,定义了⽤作分隔符的字符集合

• 第⼀个参数指定⼀个字符串,它包含了0个或者多个由delimiters字符串中⼀个或者多个分隔符分割的标 记。

• strtok函数找到str中的下⼀个标记,并将其⽤ '\0' 结尾,返回⼀个指向这个标记的指针。(注: strtok函数会改变被操作的字符串,所以在使⽤strtok函数切分的字符串⼀般都是临时拷贝的内容 并且可修改。)

• strtok函数的第⼀个参数不为 NULL ,函数将找到str中第⼀个标记,strtok函数将保存它在字符串 中的位置。

• strtok函数的第⼀个参数为 NULL ,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标 记。

• 如果字符串中不存在更多的标记,则返回 NULL 指针。

代码语言:javascript
复制
#include<stdio.h>
#include<string.h>
int main()
{
	char arr[] = "192.163.1.11";
	char* sep = ".";
	char* str = NULL;
	for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep))
	{
		printf("%s\n", str);
	}
	return 0;
}

12.strerror函数的使用

代码语言:javascript
复制
char * strerror ( int errnum )

strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。

在不同的系统和C语⾔标准库的实现中都规定了⼀些错误码,⼀般是放在 errno.h 这个头⽂件中说明 的,C语言程序启动的时候就会使用⼀个全面的变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表⽰没有错误,当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会讲对应 的错误码,存放在errno中,⽽⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是 有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。

代码语言:javascript
复制
//打印0~10错误码对应的信息
#include<stdio.h>
#include<errno.h>
#include<string.h>
int main()
{
	int i = 0;
	for (i = 0; i <= 10; i++)
	{
		printf("%s\n", strerror(i));
	}
	return 0;

}

举例:

代码语言:javascript
复制
#include<stdio.h>
#include<string.h>
#include<errno.h>
int main()
{
	FILE* pFile;
	pFile = fopen("nuexist.ent", "r");
	if (pFile == NULL)
	{
		printf("Error opening file unexist.ent:%s\n", strerror(errno));
	}
	return 0;

}

另外,perror函数可以直接打印错误信息。

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.字符分类函数
  • 2.字符转换函数
  • 3.strlen的使用和模拟实现
  • 4.strcpy的使用和模拟实现
  • 5.strcat的使用和模拟实现
  • 6.strcmp的使用和模拟实现
  • 7.strncpy函数的使用
  • 8.strncat的使用
  • 9.strncmp函数的使用
  • 10.strstr的使用和模拟实现
  • 11.strtok函数的使用
  • 12.strerror函数的使用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档