黑马程序员技术交流社区
标题:
sprintf,strcpy,memcpy使用上有什么要注意的地方
[打印本页]
作者:
Lin枫
时间:
2014-4-13 13:25
标题:
sprintf,strcpy,memcpy使用上有什么要注意的地方
本帖最后由 Lin枫 于 2014-4-14 07:42 编辑
sprintf,strcpy,memcpy使用上有什么要注意的地方?
作者:
杨晓斌
时间:
2014-4-13 14:05
sprintf:它的操作不限于是字符串,虽然目的对象是字符串,但是源对象可以是任意基本类型的数据。这个函数主要是用于其它类型数据向字符串的转换
strcpy:主要是字符串和字符串之间的复制功能。
memcpy:例如void *memcpy(void *dest, const void *src, int n);从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中,也就是说他是内存之间的拷贝。
作者:
Freedam
时间:
2014-4-13 15:19
sprintf()格式化输出函数
函数原型为int sprintf(char *string,char *format[,argument,...],arg_list);
函数sprintf()的用法和printf()函数一样,用户指定参数string(可以使指针也可以是数组),然后再根据用户的需求将指定的第一个参数格式化成第二参数的形式显示在屏幕上。arg_list为参数表,可有不定个数。
例如:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char buffer[80];
int num = 0;
scanf("%d",&num);
sprintf(buffer, "lsmseed is %d\n",num );
puts(buffer);
return 0;
}
复制代码
运行结果是:
输入8
输出lsmseed is 8
sprintf函数需要注意的是最后的arg_list,因为sprintf前两个参数都是指针类型比较固定,而arg_list是变量参数,调用者在使用中如果在指定第二参数format时没有和参数列表中的参数类型相一致会产生程序在运行中的一些逻辑错误。
举个例子:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char buffer[80];
int num = 0;
scanf("%d",&num);
sprintf(buffer, "lsmseed is %f\n",num ); //改成%f
puts(buffer);
return 0;
}
复制代码
将原来的程序修改成%f,按照原先的操作就变成了这样的结果:
输入8
输出lsmseed is 0.000000。
这是因为函数在运行时已经按照%f的格式来处理num了,但是num是整型的,所以在处理时将整型变量当作浮点型处理没有显示出我们要的结果。其他的注意就是sprintf的第一个参数的内存溢出,就是在第二参数指定格式时不要太大,以免第一个参数容不下你想要的东西。
strcpy字符串拷贝函数
函数原型extern char *strcpy(char* dest,const char* src);
其中dest是目的地址(也就是我们要拷贝到的地方),src是源地址(就是我们要拷贝的东西)
例如:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char buffer[80];
char *s = "lsmseed";
strcpy(buffer,s);
puts(buffer);
return 0;
}
复制代码
输出结果为:lsmseed
自定义的buffer中拷贝了s中的字符串并显示输出,strcpy函数应该注意的是dest参数要够大或者注意要拷贝内容的大小。因为如果src参数中的内容较多拷到dest中,dest不能容下这些东西溢出导致程序崩溃。还有一种情况就是dest指向不确定指针,例子如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *buffer=NULL;
char *s = "lsmseed";
strcpy(buffer,s);
puts(buffer);
return 0;
}
复制代码
这个程序在我的编译器下通过(有的可能不通过)但是运行的时候会报错,说是因为buffer没有指向确定的地方之类的。如果有的编译器无法编译通过证明你的编译器在编译时就排错了。所以在使用strcpy时要把dest做一个确定的指向。
memcpy内存拷贝函数
函数原型void *memcpy(void *dest,const void *src,size_t n);
简单说就是将src中的n个字节的内容拷贝到dest中去。例如:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char buffer[20]={0};
char *s = "lsmseed";
memcpy(buffer,s,5);
puts(buffer);
memcpy(buffer,s,strlen(s));
puts(buffer);
return 0;
}
复制代码
这段代码输出的结果是
lsmse
lsmseed
函数memcpy将s中的字符串的5个字符与所有的7个字符的数据分别拷贝到了buffer中。memcpy在使用过程中和以上两个函数有类似之处,都要注意内存溢出的问题,也就是原参数dest要足够大,有确定指向。不同的是,在刚才的例子中,memcpy会覆盖dest目的地址中的原有数据。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2