realloc和sscanf和0x%02hhx

1:realloc

void *realloc(void *ptr, size_t size)
  • ptr – 指针指向一个要重新分配内存的内存块,该内存块之前是通过调用 malloc、calloc 或 realloc
    进行分配内存的。如果为空指针,则会分配一个新的内存块,且函数返回一个指向它的指针。
  • size --内存块的新的大小,以字节为单位。如果大小为 0,且 ptr 指向一个已存在的内存块,则 ptr
    所指向的内存块会被释放,并返回一个空指针
  • 该函数返回一个指针 ,指向重新分配大小的内存。如果请求失败,则返回 NULL

这个函数,会重新为指针ptr分配空间,可以扩大也可以缩小。如果扩大的话,原先ptr后面有空间就直接扩大后面的空间,ptr起始地址不变。如果没有的话,就会找一个足够大的地址,把ptr中的内容复制过去,更新ptr的指针,原先ptr的空间会被释放掉。
所以存在一定的风险,当你新地址空间申请失败,而原来的空间也被释放掉了,那么你将一无所有。

2:sscanf

int sscanf(const char *str, const char *format, ...)
  • str – 这是 C 字符串,是函数检索数据的源。
  • format – 这是 C 字符串,包含了以下各项中的一个或多个:空格字符、非空格字符 和 format 说明符。

这个函数,主要作用可以把一个字符串按照给定的格式拆分到各种数据中。比如你向让字符串"1234"变成十进制或16禁止的1,2,3,4,保存在数据int a[]中,就可以使用这个函数。
这个函数的作用正好和sprintf相反

3:0x%02hhx

这个一个格式打印字符,可以只取数据中的2位进行输出。相比与%02x当数据超过2位时会按照真实的位数输出,%02hhx可以严格控制在2位输出,如果多出,会被舍弃。

4:示例

/*************************************************************************
    > File Name: relloc.c
    > Author: kayshi
    > Mail: kayshi2019@qq.com
    > Created Time: Tue 10 Nov 2020 03:59:00 PM CST
 ************************************************************************/

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

int main()
{
    char *str;
    int day, year;
    int i;
    char weekday[20], month[20], dtm[100], test[4], da[4];
    int data = 0x12345678;

    str = (char *)malloc(5);
    strcpy(str, "hello");
    printf("String = %s, Address = %p\n", str, str);
    str = (char *)realloc(str, 10);
    strcat(str, "world");
    printf("String = %s, Address = %p\n", str, str);
    free(str);

    strcpy(dtm, "Saturday March 25 1898 abcd 1234");
    sscanf(dtm, "%s %s %d %d %c%c%c%c %01hhd%01hhd%01hhd%01hhd", weekday, month, &day, &year,\
                                      &test[0], &test[1], &test[2], &test[3], &da[0], &da[1], &da[2], &da[3]);

    printf("%s %d, %d = %s\n", month, day, year, weekday );
    for(i = 0; i < 4; i++)
    {   
        printf("%c ", test[i]);
    }   
    for(i = 0; i < 4; i++)
    {   
        printf("%d ", da[i]);
    }   
    printf("\n");
    printf("0x%02hhx, 0x%02hx, 0x%02x\n", data, data, data);
    return(0);
}

结果

kayshi@ubuntu:~/code/Test$ ./a.out 
String = hello, Address = 0x55b8d0619260
String = helloworld, Address = 0x55b8d0619260
March 25, 1898 = Saturday
a b c d 1 2 3 4 
0x78, 0x5678, 0x12345678
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值