C语言第28天,字符函数和内存函数的使用与剖析

本文深入探讨了C语言中的字符函数和内存操作函数,包括字符处理的基础和memcpy、memmove、memset三个关键内存函数的使用方法与实践案例分析。
摘要由CSDN通过智能技术生成

字符函数

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>
#include <ctype.h>

//字符分类函数

int main() {
	char ch = 'w';
	int ret = islower(ch);//判断是否是小写字母
	printf("%d\n", ret);//2
	int ret2 = isdigit(ch);//判断是否是数字
	printf("%d\n", ret2);//0

	printf("----------------\n");

	char ch2 = tolower('Q');//大写转小写
	printf("%c\n", ch2);//q
	char ch3 = toupper('a');//小写转大写
	printf("%c\n", ch3);//A

	char arr[] = "i am a student";
	int i = 0;
	while (arr[i]) {
		if (islower(arr[i])) {
			arr[i] = toupper(arr[i]);
		}
		i++;
	}
	printf("%s\n", arr);//I AM A STUDENT
	return 0;
}
2
0
----------------
q
A
I AM A STUDENT

内存函数

memcpy - 指针拷贝

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

//memcpy - 指针拷贝
//void* memcpy(void* destination,const void* source,size_t num);
//函数memcpy从source的位置向后复制num个字节的数据到destination的内存位置
//这个函数在遇到'\0'的时候并不会停下来
//如果source和destination有任何的重叠,复制的结果都是未定义的

//memcpy( )函数的实现
void* my_memcpy(void* dest, const void* src, size_t length)
{
    assert(src);
    char* pdest = (char*)dest;
    const char* psrc = (const char*)src;
    while (length--)
    {
        *pdest = *psrc;
        pdest++;
        psrc++;
    }
    return dest;
}
int main()
{
    char arr1[20] = "abcd";
    char* arr2 = "efgk";
    my_memcpy(arr1, arr2, 2);
    printf("%s\n", arr1);//efcd
    system("pause");
    return 0;
}
efcd

memmove

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

//void *memmove(void *dst, void const *src,size_t length);
//memmove()函数函数和memcpy()函数所进行的操作差不多,不过会考虑重叠的问题,
//所以,对于源和目标参数可能存在重叠问题,那么就可以使用memmove(),当src 和 dest 所指的内存区域重叠时,memmove() 仍然可以正确的处理,不过执行效率上会比使用 memcpy() 略慢些。

//memmove()函数的实现
void* my_memmove(void* dst, void* src, size_t length)
{
    assert(dst);
    assert(src);
    char* pdest = (char*)dst;
    const char* psrc = (const char*)src;
    if ((pdest > psrc) && (pdest < psrc + length))
    {//从后向前拷贝
        while (length--)
        {
            *(pdest + length) = *(psrc + length);
        }
    }
    else
    {//从前向后拷贝
        while (length--)
        {
            *pdest++ = *psrc++;
        }
    }
    return dst;
}

int main()
{
    int i = 0;

    int arr1[] = { 1,2,3,5,4,6,8 };
    int sz = sizeof(arr1) / sizeof(arr1[0]);
    my_memmove(arr1 + 2, arr1, 16);
    for (i = 0; i < sz; i++)
    {
        printf("%x ", arr1[i]);
    }
    system("pause");
    return 0;
}
1 2 1 2 3 5 8

memset

#define _CRT_SECURE_NO_WARNINGS


#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
//memset
//void* memset(void* a, int ch, size_t length);
//memset()函数是把从a开始的length个字节都设置成为字符值ch,然后返回指向 ptr 的指针。
//memset() 可以将一段内存空间全部设置为特定的值,所以经常用来初始化字符数组。

//memset()函数实现
void* my_memset(void* dest, int n, size_t length)
{
    void* ret = dest;
    assert(dest);
    while (length--)
    {
        *(char*)dest = n;
        dest = (char*)dest + 1;
    }
    return ret;
}
int main()
{
    int arr1[10];
    int i = 0;
    int sz = sizeof(arr1) / sizeof(arr1[0]);
    my_memset(arr1, 0, sz * sizeof(int));
    for (i = 0; i < sz; i++)
    {
        printf("%d ", arr1[i]);
    }
    system("pause");
    return 0;
}
0 0 0 0 0 0 0 0 0 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值