栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

任务四------结构体,内存,字符串

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

任务四------结构体,内存,字符串

1、memcpy函数

memcpy()函数指的是内存拷贝函数,函数原型为void *memcpy(void *destin, void *source, unsigned n);函数的功能是从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中,即从源source中拷贝n个字节到目标destin中。

代码实现:

void *memcpy(void *destin, void *source, unsigned n)
{
	if((destin==NULL)||(source==NULL))
	{
		return NULL;
	}   
	else if(destin==source)
	{
		return source;
	}
	else
	{
		char* a=(char*)destin;
		char* b=(char*)source;
		while(n--)
		{
			*a=*b;
			a++;
			b++;
		}
		return destin;
	}
}

函数的使用:

#include
void *memcpy(void *destin, void *source, unsigned n)
{
	if((destin==NULL)||(source==NULL))
	{
		return NULL;
	}   
	else if(destin==source)
	{
		return source;
	}
	else
	{
		char* a=(char*)destin;
		char* b=(char*)source;
		while(n--)
		{
			*a=*b;
			a++;
			b++;
		}
		return destin;
	}
}
int main()
{
	char str1[10]="aaaaaa";
	char str2[10]="123456";
	int n=3;
	memcpy(str1,str2,n);
	printf("%sn",str1);
	return 0;
}

输出结果是:123aaa

2、memset()函数

这个函数是计算机中C/C++语言初始化函数。作用是将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作。函数原型为void *memset(void *s, int ch, int n)。

代码实现:

void *memset(void *s,int ch,int n)
{
	char *a=(char *)s;
	while(n--)
	{
		*a=ch;
		a++;
	}
	return s;
}

 函数使用示例:

#include
void *memset(void *s,int ch,int n)
{
	char *a=(char *)s;
	while(n--)
	{
		*a=ch;
		a++;
	}
	return s;
}
int main()
{
	char s[100]="hello world!";
	memset(s,'a',4);
	printf("%sn",s);
	return 0;
}

输出结果为:aaaao world

但是这个函数平时用于初始化,比如memset(s,0,100),就是将字符串s中的值都初始化为0。

3、malloc()函数

函数原型为:void *malloc(unsigned size)。函数功能是向系统申请大小为size的连续内存块,然后把首地址返回,如果申请不成功,返回NULL。

函数mallo()的返回值类型为void*(这是通用指针的一个重要用途),它可以指向任意类型的变量,在具体使用中,将函数malloc()的返回值强制转换到特定指针类型,赋值给一个指针。

函数的使用:

#include
#include
int main()
{
	int n;
	int *p=NULL;
	printf("please enter array size:");
	scanf("%d",&n);
	p=(int *)malloc(n*sizeof(int));
	if(p==NULL)
	{
		printf("申请内存失败");
		exit(1);//exit(1):非正常运行导致退出程序;exit(1):正常运行程序并退出程序; 
	}
	return 0;
}

4、calloc()函数

这个函数原型为:void *calloc(unsigned num,unsigned size)。函数功能为向系统申请连续的num个size大小的内存块,然后把首地址返回,如果申请不成功,则返回NULL。calloc()函数与malloc()函数最重要的区别是malloc()申请的空间是随机的,而calloc()函数申请空间之后并对所申请的整个空间初始化为0;

#include
#include
int main()
{
	int *p1=(int *)malloc(20*sizeof(int));
	int *p2=(int *)calloc(20,sizeof(int));
	printf("malloc函数所申请的空间的值为:n");
	for(int i=0;i<20;i++)
	{
		printf("%d ",*p1++);
	}
	printf("n");
	printf("calloc函数所申请的空间的值为:n");
	for(int i=0;i<20;i++)
	{
		printf("%d ",*p2++);
	}
	printf("n");
	return 0;
}

 calloc()函数的自实现

void *my_calloc(unsigned int n,unsigned int size)
{
	unsigned k=n*size;
	int *p=(int *)malloc(k);
	memset(p,0,k);
}

自定义函数的使用:

#include
#include
#include
void *my_calloc(unsigned int n,unsigned int size)
{
	unsigned k=n*size;
	int *p=(int *)malloc(k);
	memset(p,0,k);
}
int main()
{
	int *p1=(int *)malloc(20*sizeof(int));
	int *p2=(int *)my_calloc(20,sizeof(int));
	printf("malloc函数所申请的空间的值为:n");
	for(int i=0;i<20;i++)
	{
		printf("%d ",*p1);
		p1++;
	}
	printf("n");
	printf("my_calloc函数所申请的空间的值为:n");
	for(int i=0;i<20;i++)
	{
		printf("%d ",*p2++);
	}
	printf("n");
	return 0;
}

输出结果:

5、itoa()函数

函数原型: char *(int n,char *str,int radix)。函数功能是将数值转换成字符串,其中radix是转换成相应的进制。

使用示例:

#include
#include
int main()
{
	int n=1234;
	char str[100];
	itoa(n,str,2);
	printf("数字:%d,字符串:%sn",n,str);
	itoa(n,str,8);
	printf("数字:%d,字符串:%sn",n,str);
	itoa(n,str,10);
	printf("数字:%d,字符串:%sn",n,str);
	itoa(n,str,16);
	printf("数字:%d,字符串:%sn",n,str);
	return 0;
}

输出结果:

6、atoi函数

这个函数的原型为:int atoi(const char *nptr);功能是将字符串转化成整型。

使用示例:

#include
#include
int main()
{
	char str[]="12345.67";
	int n=atoi(str);
	printf("n=%dn",n);
	char a[]="10";
	char b[]="20";
	int m=atoi(a)+atoi(b);
	printf("m=%dn",m);
	return 0;
}

输出n=12345    m=30.

7、atof()函数

这个函数是将字符串转化成浮点数,函数原型为:double atof(const char *nptr)。

使用示例:

#include
#include
int main()
{
	char str[]="12345.67";
	double n=atof(str);
	printf("n=%lfn",n);
	return 0;
}

输出结果为:n=12345.670000.

8、strtod()函数

函数功能是将字符串转换成浮点数,函数原型:double strtod(const char *nptr,char **endptr).

strtod()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,到出现非数字或字符串结束时('')才结束转换,并将结果返回。若endptr不为NULL,则会将遇到不合条件而终止的nptr中的字符指针由endptr传回。参数nptr字符串可包含正负号、小数点或E(e)来表示指数部分。如123.456或123e-2。

#include
#include
int main()
{
	char *endptr;
	char a[]="1234.567";
	char b[]="234.4wers";
	char c[]="232.25e4";
	printf("%lfn",strtod(a,NULL));
	printf("b=%lfn",strtod(b,&endptr));
    printf("endptr=%sn",endptr );
    printf("c=%lfn",strtod(c,NULL));
	return 0;
}

9、sprintf()函数

这个函数原型为:int sprintf( char *string, const char *format [, argument,...] )。函数功能是把格式化的数据写入某个字符串中。

string是字符数组名,format是格式化字符串。sprintf函数的功能是将格式之后的字符串输出到目的字符串中,而printf函数是将格式化之后的字符串输出到屏幕上

#include
int main(void)
{
   char  string[200];
   char s[]="hello,wolrd!";
   sprintf(string,"String:%s",s);//把字符串s(格式化后的字符串)中的内容打印到目的字符串string(字符数组)中
   printf("%sn",string);
   return 0;
}

 

 10、sscanf()函数

这个函数的功能是读取格式化的字符串中的数据,函数原型为:int sscanf(const char *string const char *format [, argument,...] )。scanf与sscanf都是用于输入的,只不过scanf以屏幕为输入源,sscanf以目的字符串为输入源。

#include
int main(void)
{
   char  string[200];
   char s[]="hello,wolrd!";
   sscanf(s,"%s",string);//将格式化后的字符串s输入到目的字符串string中
   printf("%sn",string);
   return 0;
}

 11、fgets()函数

fgets函数功能为从指定的流中读取数据,每次读取一行。其原型为:char *fgets(char *str, int n, FILE *stream);从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串内。当读取 (n-1) 个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。

scanf()函数和gets()函数和fgets()函数读取字符串的异同

scanf()在读取字符串的时候遇到空白符(空格键、换行符、制表符)读取结束。

gets()在读取字符串的时候遇到换行符读取结束,gets()读取换行符之前(不包括换行符)的所有字符,在这些字符后添加一个空字符()

fgets()在读取字符串的时候也是遇到换行符读取结束,但是fgets()函数与gets()函数有很多不同,比如:fgets()函数需要第二个参数来说明最大读入字符数,如果这个参数值为n,fgets()会读取最多n-1个字符或者读到换行符,由二者中最先满足的那一个终止输入,如果fgets()读到换行符,就会把它存到字符串里,而不是像gets()那样丢弃它。并且它还需要第三个参数来说明读取哪一个文件。从键盘上读取数据时,可以使用stdin作为该参数。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/648327.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号