C语言中的一些内存函数

本文介绍了C语言中常用的字符分类函数ctype.h,如islower、isupper等,以及内存操作函数如memcpy、memmove、memset和memcmp,通过实例展示了如何使用这些函数进行字符转换和内存复制/填充,旨在帮助初学者节省编程时间。
摘要由CSDN通过智能技术生成

我想我们在刚开始学习c语言是应该就使用过strcpu,strcmp,strcat这类的函数。我不知道你们在使用这些函数时有没有感到很轻松,可以省不少时间不用去编写一些功能,有没有困惑为什么只有对字符类型的使用,其实对于这类函数c语言中还有不少,今天我把一些我觉得挺有用的一些函数列出来希望能对你有一点帮助。(目录跳转文章链接不能用,不知道为啥(),但是跳转cplusplus的没问题)

目录

字符分类函数ctype.h- 1

C语⾔内存函数- 2

字符分类函数(头文件全是)ctype.h

函数

如果他的参数符合下列条件就返回真

Iscntrl

任何控制字符

Isspace

空白字符:空格‘’,换页’f’,换行'\n',回车“r’,制表符’\t'或者垂直制表符’\v'

isdigit

十进制数字0~9

isxdigit

十六进制数字,包括所有十进制数字,小写字母a~f,大写字母A~F

islower

小写字母a~z

isupper

大写字母A~Z

isalpha

字母a~z或A~Z

isalnum

字母或者数字,a~z,A~Z,0~9

ispunct

标点符号,任何不属于数字或者字母的图形字符(可打印)

isgraph

任何图形字符

isprint

任何可打印字符,包括图形字符和空白字符

这些函数用法很相似这是c语言的一个官网,它可以查询函数的用法cppreference.com(英文版)

cppreference.com(中文版)

或者你可以下一个MSDN,下载方法不难这里我就不赘述了。

我也将举几个例子希望能帮助到大家

int islower( int c ); islower 是能够判断参数部分的 c 是否是写字的。通过返回值来说明是否是写字,如果是写字就返回0的整数,如果不是写字,返回 0。

#include <stdio.h> 
#include <ctype.h> 
int main()
{
	int i = 0;
	char str[] = "Hello World.\n";
	char c;
	while (str[i])
	{
		c = str[i];
		if (islower(c))
			c -= 32;
		putchar(c);
		i++;
	}
	return 0;
}

我想你们应该发现了这是一个将字符串中的⼩写字⺟转⼤写,其他字符不变的代码,我们把小写转成大写是采用-32的方法(ASCLL:A-65,a-97),其实也有库函数

int tolower ( int c ); //将参数传进去的写字

int toupper ( int c ); //将参数传进去的写字

#include <stdio.h> 
#include <ctype.h> 
int main()
{
    int i = 0;
    char str[] = "Hello World.\n";
    char c;
    while (str[i])
    {
        c = str[i];
        if (islower(c))
            c = toupper(c);
        putchar(c);
        i++;
    }
    return 0;
}

1. memcpy 使和模拟实现

1 void * memcpy ( void * destination, const void * source, size_t num );

函数memcpy从source的位置开始向后复制num个 字节 的数据到destination指向的内存位置。
这个函数在遇到 '\0' 的时候并不会停下来。
如果source和destination有任何的重叠,复制的结果都是未定义的。
#include <stdio.h>
#include <string.h>
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[10] = { 0 };
	memcpy(arr2, arr1, 20);//20是20字节,也就是5个int
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr2[i]);//5 5 5 5 5 0 0 0 0 0 
	}
	return 0;
}

对于这个函数可以自己模拟实现下,我下面提供一个我写的,大家可以参考一下

//模拟实现memcpy
void* my_memcpy(void* dest, const void* src, size_t count)
{
	assert(dest && src);
	void* ret = dest;
	while (count--)
	{
		*((char*)dest) = *((char*)src);
		dest = ((char*)dest) + 1;
		src = ((char*)src) + 1;
	}
	return ret;
}
int main()
{
	int dest[100];
	int src[] = {1,2,3,5,4,8,9,6,45,8,6,2,365,6};
	size_t sz = sizeof(src) / sizeof(src[0]);
	my_memcpy(dest,src, sizeof(int)*sz);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", *(dest + i));
	}
	return 0;
}

我的代码和VS提供的有点出入,我的代码无法复制空间有重叠的,不过这不是BUG因为标准并未要求,对于空间有重叠的一般使用memmove这个函数(对于空间重叠的理解如下图,dest是复制目标,src是复制内容来源)

而对于memmove使用有些memmove上文很像,

2.memmove使⽤和模拟实现

void * memmove ( void * destination, const void * source, size_t num ); 模拟实现略有不同,我只提供模拟实现(代码中后->前的意思是对于src对dest赋值而言的,具体可以看着上图用笔写一下就知道了)

void* my_memmove(void* dest, const void* src, size_t count)
{
	assert(dest && src);
	void* ret = dest;
	while (count--)
	{
		//src < dest 后->前
		if (src < dest)
		{
			*((char*)dest+count) = *((char*)src+count);
		}
 		else if (src == dest)
		{
			break;
		}
		else
		{
			*((char*)dest) = *((char*)src);
			dest = ((char*)dest) + 1;
			src = ((char*)src) + 1;
		}
	}
	return ret;
}
int main()
{
	int dest[100];
	int src[] = { 1,2,3,5,4,8,9,6,45,8,6,2,365,6 };
	my_memmove(src+2, src, sizeof(int) * 4);
	int i = 0;
	for (i = 0; i < 14; i++)
	{
		printf("%d ", *(src + i));
	}
	return 0;
}

3. memset函数的使⽤

void * memset ( void * ptr, int value, size_t num );
#include <stdio.h>
#include <string.h>
int main ()
{
 char str[] = "hello world";
 memset (str,'x',6);
 printf(str);//一种用法
 return 0;
}

对于memset有个注意事项就是它是以字节为单位,用的时候要注意

int main()
{

	int arr[] = { 1,2,3,4,5 };
	memset(arr, 1, 20);
	for (int i = 0; i < 5; i++)
	{
		printf("%d ", arr[i]);
	}
//打印出16843009 16843009 16843009 16843009 16843009,原因下图内存
	return 0;
}

4. memcmp函数的使⽤

对于该函数的返回值有什么区别我就不说了(因为太晚了我要睡觉了()),点击memcmp有链接,它会跳转。

#include <stdio.h>
#include <string.h>
int main()
{
    char buffer1[] = "DWgaOtP12df0";
    char buffer2[] = "DWGAOTP12DF0";
    int n;
    n = memcmp(buffer1, buffer2, sizeof(buffer1));
    if (n > 0)
        printf("'%s' is greater than '%s'.\n", buffer1, buffer2);
    else if (n < 0)
        printf("'%s' is less than '%s'.\n", buffer1, buffer2);
    else
        printf("'%s' is the same as '%s'.\n", buffer1, buffer2);
    return 0;
}

最后谢谢你的阅读,希望这篇文章对你有点帮助!

  • 27
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值