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;
}