【C语言】字符/字符串函数的概念,使用及模拟实现

Tiny Spark get dazzling some day.

1.字符函数

1.1 字符分类函数

字符分类函数,通常用来判断 目标字符 是什么类型 的字符。
如果字符不是该类型,返回 假(0);字符是该类型, 返回 真(非0值)
在使用 该类函数前需要包含头文件:<ctype.h>

函数函数返回 真 的参数条件范围
iscntrl任何控制字符
isspace空白字符,如空格,换页 ‘\f’,换行 ’\n’,回车 ‘\r’ 和 制表符 ‘\t’
isdigit十进制数字 0 ~ 9
isxdigit十六进制数字,包括十进制数字0 ~ 9,小写字母 a ~ f,大写字母A ~ F
islower小写字母 a ~ z
isupper大写字母 A ~ Z
isalpha英文字母 a ~ z,A ~ Z
isalnum数字 0 ~ 9 或 字母 a ~ z, A ~ Z
ispunct标点符号, 任何不属于 数字 或 字母 的可打印图形字符
isgraph任何图形字符
isprint能打印的字符都可以,包括 空白字符 和 图形字符

1.2 字符转换函数

C语言提供了 2 个字符转换参数:

int tolower ( int c ); // 将参数传进去的 大写字母 转 ⼩写 
int toupper ( int c ); // 将参数传进去的 小写字母 转 ⼤写
这里 参数c 的变量类型为 int,是指 c 是要 转换/强制转换 为 intEOF 的字符。

同样的他们也需要包含头文件:<ctype.h>
所以,在需要将一个英文字母 从 大写(小写)转为 小写(大写)时,除了让字符 +(-)32 方法外,
也可以使用 tolower(toupper)函数

#include <stdio.h>
#include <ctype.h>
int main()
{
	char ch = 'A';
	printf("%c %c", ch, tolower(ch));// 结果就是 A a
	return 0;
}

2. 字符串函数

接下来为字符串函数,用于处理字符串的计算,复制等,需要包含头文件<string.h>

2.1 strlen

  • 函数原型:
size_t strlen ( const char* str );

strlen 用来计算字符串长度的函数,它以 ’ \0 ’ 为结束标志,返回结束之前出现的字符个数,
但它计算的时候不会将 ’ \0 ’ 算进来。

注意! 它的 返回类型 是 size_t , 是 无符号整型 ,在用占位符时要用 %zd

  • 函数使用:
char str[] = "ShowTime!";
printf("%zd", strlen(str));// 结果就是 8个字母 + 1个感叹号 == 9
  • 我们用 指针 的方式来模拟一下 strlen 函数:
int Sim_strlen(char* s)
{
 	assert(str);
 	char* p = s;
	while(*p != '\0')// 当指针 p 走到 '\0'的时候停下
 		p++;
 	return p - s;// |指针-指针| = 他们之间的元素数目
}

2.2 strcpy

  • 函数原型:
char* strcpy( char* destination, const char* source );
                  目标空间             源字符串

strcpy 用来将一个字符串()的内容 拷贝到 另一个空间(目标)上。

规则:
1.在源字符串中 必须 以 ’ \0 ’ 为结束,再拷贝的时候也会把这个 ’ \0 ’ 拷贝过去。
2.目标空间必须 足够大(够放源字符串就行,注意有 ’ \0 ’ 要多算一个)而且空间 可以修改

  • 函数使用:
	char dest[10] = "";
	char src[10] = "ShowTime!";// 这里源字符串也可以写为常量的 char* src = "ShowTime!";
	strcpy(dest, src);// 此时 dest 的内容就是 "ShowTime!"
  • 函数的模拟实现:
char* Sim_strcpy(char* dest, const char* src)
{ 
	char *ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	// 先检验 dest 和 src 是否为空指针
	while((*dest++ = *src++))// 拷贝值的同时又在下次 指向下一个字符(空间)的地址
	{
		;
	}
	return ret;
}

2.3 strcat

  • 函数原型:
char* strcat ( char* destination, const char* source );
                   目标空间             源字符串

strcat 用来将一个字符串()的内容 接在 另一个空间(目标)字符串内容的后面。

规则:

  1. 源字符串 必须 以 ’ \0 ’ 结束。
  2. 目标字符串中也 必须 有 ’ \0 ',函数哥们它至少得知道从哪开始吧。
  3. 目标空间必须足够大(能容纳 源字符串的内容+目标字符串的内容),而且空间 可以修改
  • 函数使用:
char dest[12] = "Whatcan";// 这里要注意目标空间要留有足够剩余空间放源字符串的数据
char src[] = "Isay";
strcat(dest, src);// 此时 dest 的内容就是 "WhatcanIsay" 没有 out 不好意思
  • 函数的模拟实现:
char* Sim_strcat(char* dest, const char* src) 
{
	char* ret = dest;
 	assert(dest != NULL);
 	assert(src != NULL);
 	// 先检验 dest 和 src 是否为空指针
	while(*dest)
 	{
 		dest++;
 	}// 先让指针指向目标字符串的'\0'结束位置,作为函数的起始位
 	while((*dest++ = *src++))// 拷贝值的同时又在下次 指向下一个字符(空间)的地址(跟strcpy一样)
 	{
 		;
 	}
 	return ret;
}

所以 strcpystrcat 是有相似的, strcpy 更多的是字符串往 全空的空间 拷贝过去, 而 strcat 则是在 原有的基础上,往原有内容后 空的空间拷贝过去。

2.4 strcmp

  • 函数原型:
int strcmp ( const char* str1, const char* str2 );

strcmp函数用于比较两个字符串的大小。

注意 !该函数比较的不是字符串的 长度 !而是比较字符串第一个 相同位置 的不同字符所对应的 ASCII码值的大小
规则:

  1. 第一个字符串 大于 第二个字符串,则返回值 大于0
  2. 第一个字符串 等于 第二个字符串,则返回值 等于0
  3. 第一个字符串 小于 第二个字符串,则返回值 小于0
  • 函数使用:
char* str1 = "ABCDE";
char* str2 = "ABCDF";
int res = strcmp(str1, str2);// res == -1

首先,str1 和 str2 的前四个字符ABCD相同,只需比较 E 和 F ,对应的 ASCII 码表值 E 比 F 小。 所以, 函数返回值 小于0, res == -1 < 0。

  • 函数的模拟实现
int Sim_strcmp (const char* str1, const char* str2)
{
 	assert(str1 != NULL);
 	assert(str2 != NULL);
 	//先检验 str1 和 str2 是否为空指针
 	while(*str1 == *str2)
 	{
 		if(*str1 == '\0')
 		return 0;
 		str1++;
 		str2++;
 	}
 	return *str1 - *str2;
 }

2.5 strncpy

-函数原型:

char* strncpy ( char* destination, const char* source, size_t num );
					目标空间             源字符串         拷贝数目

跟函数 strcpy 作用类似,strncpy 也用来将一个字符串()的内容 拷贝到 另一个空间(目标)上,但是多规定了拷贝数目。

规则:

  1. 拷贝 num 个字符串从源字符串到目字符串标空间。
  2. 如果源字符串的长度 小于num,则拷贝完字符串之后,在目标的后面追加 0,直到 num 个。
  3. strncpy 不会将 ’ \0 ’ 复制过去
  1. 函数使用
char dest[10] = "";
char src[10] = "HElloWorld";
int num = 5;
strncpy(dest, src, num);// 此时 dest 的内容就是 "Hello", 后面的 "World" 不会复制过来
  1. 函数的模拟实现
char* Sim_strncpy(char* dest, const char* src, size_t num)
{
	char* ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	while (num--)
	{
		*dest = *src;
		dest++;
		src++;
	}
	return ret;
}

2.6 strncat

  • 函数原型:
char* strncat ( char* destination, const char* source, size_t num );
				    目标空间             源字符串         拷贝数目

跟函数 strcat 作用类似,strncat 也将一个字符串()的内容 接在 另一个空间(目标)字符串内容的后面,但是多规定了拷贝数目。

规则:

  1. 将源字符串的前 num 个字符追加到 目标空间 的字符串末尾,再追加⼀个 ‘\0’ 字符。
  2. 如果源字符串的长度 小于num 的时候,只会将字符串中到 ’ \0 * 的内容追加到 目标空间的字符串末尾。
  • 函数使用:
char dest[40] = "This book belongs to the "; // 这里要注意目标空间要留有足够剩余空间放源字符串的数据
char* src = "Half Blood Prince";
int num = 4;
strncat(dest, src, num);// 此时 dest 的内容就是 "This book belongs to the Half"
  • 函数的模拟实现
char* Sim_strncat(char* dest, char* src, int num)
{
	char* ret = dest;
	while (*dest)
	{
		dest++;
	}
	while (num--)
	{
		*dest = *src;
		dest++;
		src++;
	}
	return dest;
}

2.7 strncmp

  • 函数原型:
int strncmp ( const char* str1, const char* str2, size_t num );

跟函数 strcmp 作用类似,strncmp作用比较两个函数的前 num 个字符。

再次注意 !该函数与函数 strcmp 一样,比较的不是字符串的 长度 !而是比较字符串第一个 相同位置 的不同字符所对应的 ASCII码值的大小
规则:

  1. 第一个字符串 大于 第二个字符串,则返回值 大于0
  2. 第一个字符串 等于 第二个字符串,则返回值 等于0
  3. 第一个字符串 小于 第二个字符串,则返回值 小于0
  • 函数使用:
char* str1 = "ABCDX";
char* str2 = "ABCDY";
int num = 4;
int res = strncmp(str1, str2, num);

尽管 str1 和 str2 比较 X 和 Y 不同,str2 是应该大于 str1的,可我们只比较前 4 个字符,str1 和 str2 前个字符都是相同的ABCD,所以 str1等于str2, 函数返回值为 0, res == 0。

  
  
  Stay hungry. Stay Foolish. 饥渴求知,虚怀若愚。
  感谢各位读者支持,虚心请教,如有错漏或可改进点,请任意指出,感激不尽!
  一起进步!


  • 50
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: C语言中常用的字符串替换函数是`str_replace`,它可以在一个字符串中查找并替换指定的子字符串。下面我将简单地模拟实现一个`str_replace`函数。 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> char* str_replace(const char* str, const char* search, const char* replace) { char* result; int search_len = strlen(search); int replace_len = strlen(replace); int count = 0; // 统计需要替换的次数 const char* s = str; while ((s = strstr(s, search)) != NULL) { count++; s += search_len; } // 计算替换后的字符串长度 int result_len = strlen(str) + count * (replace_len - search_len); result = (char*)malloc(result_len + 1); // 开始替换 char* p = result; s = str; while ((s = strstr(s, search)) != NULL) { int n = s - str; strncpy(p, str, n); p += n; strncpy(p, replace, replace_len); p += replace_len; str = s + search_len; } strcpy(p, str); return result; } int main(void) { const char* str = "Hello, world!"; const char* search = "world"; const char* replace = "everyone"; char* result = str_replace(str, search, replace); printf("替换前: %s\n", str); printf("替换后: %s\n", result); free(result); return 0; } ``` 上述代码实现了一个简单的`str_replace`函数。它首先统计了需要替换的次数,并根据替换的次数计算了替换后的字符串长度。然后,它分配了足够的内存空间来存储替换后的字符串,并进行了替换操作。最后,它返回了替换后的字符串。在`main`函数中,我们可以看到如何使用这个函数来替换一个字符串中的子字符串。 需要注意的是,本示例只是对`str_replace`函数的简单模拟实现,实际使用中还需要处理更多的边界情况和错误处理。 ### 回答2: C语言中没有内置的字符串替换函数,但我们可以通过模拟实现一个字符串替换函数。 首先,我们可以定义一个函数,该函数接受三个参数:源字符串、待替换的子字符串、替换后的子字符串函数的返回值是替换完成后的字符串。 接下来,我们可以使用循环来遍历源字符串。在每次循环中,比较源字符串中是否存在待替换的子字符串。如果存在,我们就将替换后的子字符串复制到新的字符串中。如果不存在,我们将源字符串中的当前字符复制到新的字符串中。 最后,返回新的字符串即可。 下面是一个简单的模拟实现示例: ```c #include <stdio.h> #include <string.h> char* stringReplace(char* source, const char* search, const char* replace) { char* result; int i, j, sourceLen, searchLen, replaceLen, count; sourceLen = strlen(source); searchLen = strlen(search); replaceLen = strlen(replace); count = 0; for (i = 0; i < sourceLen; i++) { if (strstr(&source[i], search) == &source[i]) { count++; i += searchLen - 1; } } result = (char*)malloc(sourceLen + count * (replaceLen - searchLen) + 1); i = 0; j = 0; while (source[i]) { if (strstr(&source[i], search) == &source[i]) { strcpy(&result[j], replace); j += replaceLen; i += searchLen; } else result[j++] = source[i++]; } result[j] = '\0'; return result; } int main() { char source[] = "Hello, World!"; const char search[] = "World"; const char replace[] = "C Language"; char* result = stringReplace(source, search, replace); printf("替换后的字符串: %s\n", result); free(result); return 0; } ``` 这是一个简单的模拟实现,实际上字符串替换还涉及到更多复杂的情况和细节,比如大小写敏感、替换次数限制等等。需要根据实际需求进行更进一步的完善。 ### 回答3: C语言字符串替换函数模拟实现的方法有很多,以下是一种可能的实现方式: ```c #include <stdio.h> #include <string.h> void str_replace(char *str, const char *find, const char *replace) { int find_len = strlen(find); int replace_len = strlen(replace); int str_len = strlen(str); char result[100]; int result_len = 0; int i = 0; while (i < str_len) { if (strncmp(&str[i], find, find_len) == 0) { // 找到需要替换的字符串 strncpy(&result[result_len], replace, replace_len); result_len += replace_len; // 跳过被替换的部分 i += find_len; } else { // 将原字符串字符复制到结果字符串中 result[result_len] = str[i]; result_len++; i++; } } // 将新的结果字符串复制回原字符串中 strncpy(str, result, result_len); str[result_len] = '\0'; } int main() { char str[100] = "Hello, World!"; char find[10] = "World"; char replace[10] = "Alice"; printf("Before replace: %s\n", str); str_replace(str, find, replace); printf("After replace: %s\n", str); } ``` 这个函数的思路是首先计算出原字符串、需要查找的字符串以及替换的字符串的长度。然后以原字符串为基础,通过遍历每个字符的方式,查找需要替换的字符串,然后将替换的字符串复制到结果字符串中,同时跳过原字符串中已经被替换的部分。最后将结果字符串复制回原字符串中,完成字符串的替换。在主函数中,我们可以看到使用这个函数对原始字符串中的特定字符串进行了替换操作。运行程序后,可以输出替换后的字符串

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值