C语言精通大牛笔记DAY2_开辟内存与sscanf从字符串获取数据

21 篇文章 0 订阅
15 篇文章 0 订阅
本文介绍了C语言中用于内存管理的三个重要函数:calloc用于动态分配并初始化内存,realloc用于调整已分配内存的大小,以及sscanf用于解析字符串并转换数据。通过实例展示了如何在实际编程中使用这些函数进行字符串操作和内存操控。
摘要由CSDN通过智能技术生成

C语言精通大牛笔记DAY2

1.堆区开辟内存其它函数
a. calloc
#include <stdlib.h>
void * calloc(size_t nmemb, size_t size);

功能:

  • 在内存动态存储区中分配nmemb块长度为size字节的连续区域。calloc自动将分配的内存 置0

参数:

  • nmemb:所需内存单元数量

  • size:每个内存单元的大小(单位:字节)

返回值:

  • 成功:分配空间的起始地址

  • 失败:NULL

b. realloc
#include <stdlib.h>
void *realloc(void *ptr, size_t size);

功能:

  • 重新分配用malloc或者calloc函数在堆中分配内存空间的大小。

  • realloc不会自动清理增加的内存,需要手动清理,如果指定的地址后面有连续的空间,那么就会在已有地址基础上增加内存,如果指定的地址后面没有空间,那么realloc会重新分配新的连续内存,把旧内存的值拷贝到新内存,同时释放旧内存。

参数:

  • ptr:为之前用malloc或者calloc分配的内存地址,如果此参数等于NULL,那么和realloc与malloc功能一致

  • size:为重新分配内存的大小**,** 单位:字节

返回值:

  • 成功:新分配的堆内存地址

  • 失败:NULL

2.sscanf()
#include <stdio.h>
int sscanf(const char *str,const char *format,...);

功能:

  • 从str指定的字符串读取数据,并根据参数format字符串来转换并格式化数据。

参数:

  • str:指定的字符串首地址

  • format:字符串格式,用法和scanf()一样

返回值:

  • 成功:成功则返回参数数目,失败则返回-1

  • 失败: - 1

格式作用
%*s或%*d跳过数据
%[width]s读指定宽度的数据
%[a-z]匹配a到z中任意字符(尽可能多的匹配)
%[aBc]匹配a、B、c中一员,贪婪性
%[^a]匹配非a的任意字符,贪婪性
%[^a-z]表示读取除a-z以外的所有字符

使用案例

#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

void test01()
{
	char * src = "12345abcde 54321";		//忽略遇到空格 或 \t 会结束
	char buf[128] = { 0 };
	int num = 0;
	sscanf(src, "%*d%*s%d", &num);
	printf("%d\n", num);
}

void test02()
{
	char * src = "12345abcde54321";		
	char buf[128] = { 0 };
	int num = 0;
	sscanf(src, "%*d%*[a-z]%d", &num);		//忽略a-z的字符
	printf("%d\n", num);
}

void test03()
{
	char * src = "12345abcde54321";
	char buf[128] = { 0 };

	sscanf(src,"%6s",buf);					//指定宽度的字符串
	printf("%s\n", buf);
}

//练习
//1.	已给定字符串为: helloworld@itcast.cn, 请编码实现helloworld输出和itcast.cn输出。
//2.	已给定字符串为:123abcd$myname@000qwe.请编码实现匹配出myname字符串,并输出.

void lianxi1()
{
	char * src = "helloworld@itcast.cn";
	char buf1[256] = { 0 };
	char buf2[256] = { 0 };
	sscanf(src, "%[^@]", buf1);
	sscanf(src, "%*[a-z]@%s", buf2);
	printf("buf1:%s\n", buf1);
	printf("buf2:%s\n", buf2);
}

void lianxi2()
{
	char * src = "123abcd$myname@000qwe";
	char buf1[128];
	memset(buf1, sizeof(buf1), 0);
	sscanf(src,"%*[^$]$%[^@]",buf1);
	printf("buf1:%s\n", buf1);
}

void getUserName()
{
	char * src = "zhaoqing_killer@163.com";
	char name[128];
	memset(name, sizeof(name), 0);
	sscanf(src, "%[^@]", name);
	printf("UserName:%s\n", name);
}


int main()
{
	//test01();
	//test02();
	//test03();
	//lianxi1();
	lianxi2();
	//getUserName();
	system("pause");
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值