栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言处理字符和字符串的库函数的使用和注意事项

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言处理字符和字符串的库函数的使用和注意事项

1.求字符串长度的函数 strlen 

  (1)字符串已经 '' 作为结束标志,strlen函数返回的是在字符串中 '' 前面出现的字符个数(不包含 '' )。

  (2)参数指向的字符串必须要以 '' 结束。所以字符串必须为char str[]="abcde";这种类型

  (3)注意strlen函数的返回值为size_t,是无符号的

strlen的模拟实现

#include 
#include
size_t mystrlen(const char* str) {
	int size = 0;
	assert(str != NULL);
	while (*str++ != '') {
		size++;
	}
	return size;
}
int main() {
	char str[100] = { 0 };
	scanf("%s", str);
	printf("%d",mystrlen(str));
	return 0;
}

2.字符串拷贝函数 strcpy

(1)源字符串必须以 '' 结束。 (2)会将源字符串中的 '' 拷贝到目标空间。 (3)目标空间必须足够大,以确保能存放源字符串。 (3)目标空间必须可变。

strcpy的模拟实现

#include 
#include
void* mystrcpy(const char* str1, char* str2) {
	assert(str1 != NULL);
	assert(str2 != NULL);
	while (*str1 != '') {
		*str2 = *str1;
		str1++;
		str2++;
	}
	return str2;
}

int main(){
	char str1[100] = { 0 };
	char str2[100] = { 0 };
	scanf("%s", str1);
	mystrcpy(str1,str2);
	printf("%s", str2);
	return 0;
}
3.将两个字符串合二为一函数strcat

(1)源字符串必须以 '' 结束.

(2)目标空间必须有足够的大,能容纳下源字符串的内容。

(3)目标空间必须可修改。 strcat的代码实现
#include 
#include
//strcat
char* my_strcat(char* str1, const char* str2) {
	char* s = str1;
	while (*str1 != '') {
		str1++;
	}
	while (*str2 != '') {
		*str1 = *str2;
		str1++;
		str2++;
	}
	return s;
}
int main() {
	char str1[100] = { 0 };
	char str2[100] = { 0 };
	scanf("%s", &str1);
	scanf("%s", &str2);
	printf("%s", my_strcat(str1, str2));
	return 0;
}

4.字符串比较函数strcmp

第一个字符串大于第二个字符串,则返回大于 0 的数字 第一个字符串等于第二个字符串,则返回 0 第一个字符串小于第二个字符串,则返回小于 0 的数字
#include 
#include
strcmp
int my_strcmp(const char* str1, const char* str2) {
	char* a = str1;
	char* b = str2;
	assert(str1 != NULL);
	assert(str2 != NULL);
	while (*a != '') {
		if (*b == '') {
			return 1;
		}
		a++;
		b++;
	}
	if (*b != '') {
		return -1;
	}
	int x = 0;
	int y = 0;
	while (*str1 != '') {
		x = *str1 - '0';
		y = *str2 - '0';
		if (x > y) {
			return 1;
		}
		if (x < y) {
			return -1;
		}
		str1++;
		str2++;
	}
	return 0;
}
int main() {
	char str1[100] = { 0 };
	char str2[100] = { 0 };
	scanf("%s", &str1);
	scanf("%s", &str2);
	printf("%d", my_strcmp(str1, str2));
	return 0;
}

5.判断一个字符串是否为另一个字符串的子串strstr

strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回 str1字符串从 str2第一次出现的位置开始到 str1结尾的字符串;否则,返回NULL。

char* strstr(const char* str1,const char* str2) {
	assert(str1 != NULL);
	assert(str2 != NULL);
	char* a;
	char* b;
	while (*str1 != '') {
		a = str1;
		b = str2;
		while (*b != '') {
			if (*b != *a) {
				break;
			}
			a++;
			b++;
		}
		if (*b == '') {
			return str1;
		}
		str1 = str1 + 1;
		
	}
	return NULL;
}


int main() {
	int size = 0;
	char str1[100] = { 0 };
	char str2[100] = { 0 };
	scanf("%s", &str1);
	scanf("%s", &str2);
	printf("%s", strstr(str1, str2));
	return 0;
}

6.将字符串切分的函数strtok

strtok是将字符串按照某个切分符切分为数个片段

7.memcpy

原型为 void * memcpy ( void * destination, const void * source, size_t num );

函数 memcpy 从 source 的位置开始向后复制 num 个字节的数据到 destination 的内存位置。 这个函数在遇到 '' 的时候并不会停下来。 如果 source 和 destination 有任何的重叠,复制的结果都是未定义的。
void* my_memcpy(const void* str1, void* str2, size_t count) {
	void* s = str2;
	assert(str1 != NULL);
	assert(str2 != NULL);
	int i = 0;
	while (i < count) {
		*(char*)str2 = *(char*)str1;
		str1 = (char*)str1 + 1;
		str2 = (char*)str2 + 1;
		i++;
	}
	return s;
}
int main() {
	int size = 0;
	char str1[100] = { 0 };
	char str2[100] = { 0 };
	scanf("%s", &str1);
	printf("%s", (char*)my_memcpy(str1, str2, 10));
	return 0;

}

8.memmove

原型为void * memmove ( void * destination, const void * source, size_t num );

memmove和 memcpy 的差别就是 memmove 函数处理的源内存块和目标内存块是可以重叠的。 如果源空间和目标空间出现重叠,就得使用 memmove 函数处理。 memmove的代码实现:
void* my_memmove(const void* str1, void* str2,size_t num) {
	void* s = str2;
	int max = num;
	assert(str1 != NULL);
    assert(str2 != NULL);
	if (str2 > str1 && (char*)str2 <=  (char*)str1 + num) {
		str1 = (char*)str1 + num - 1;
		str2 = (char*)str2 + num - 1;
		while (max != 0) {
			*(char *)str2 = *(char *)str1;
			str1=(char*)str1-1;
			str2=(char*)str2-1;
			max--;
		}
	}
	else {
		int i = 0;
		while (i < num) {
			*(char*)str2 = *(char*)str1;
			str1 = (char*)str1 + 1;
			str2 = (char*)str2 + 1;
			i++;
		}
	}
	return s;
}


int main() {
	int size = 0;
	char str1[100] = { 0 };
	char str2[100] = { 0 };
	scanf("%s", &str1);
	printf("%s",(char*)my_memmove(str1, str2, 5));
	return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/433574.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号