基于C++中sprintf的错误总结详解
所属分类:
软件编程 / C 语言
阅读数:
131
收藏 0赞 0分享
sprintf 是个变参函数,使用时经常出问题,而且只要出问题通常就是能导致程序崩溃的内存访问错误。
下面对sprintf 常出错误问题进行简单的总结:
1、缓冲区溢出:第一个参数的长度太短了,解决办法:将第一个参数的长度扩大。打印字符串时,尽量使用”%.ns”的形式指定最大字符数
char buf[5];
sprintf(buf, ":%d", 3246);
printf("buf is %s\n", buf);
将buf修改为char buf[6]
2、忘记第一个参数:原因用printf 用得用习惯了,偶尔会忘记
char buf[6];
sprintf(":%d", 3246);
printf("buf is %s\n", buf);
错误提示: error C2664: 'sprintf' : cannot convert parameter 2 from 'int' to 'const char *'
3、变参对应出问题:通常是忘记了提供对应某个格式符的变参,导致以后的参数统统错位,检查检查吧。尤其是对应”*”的那些参数,都提供了吗?
不要把一个整数对应一个”%s”
char buf[100];
int a=6;
sprintf(buf, ":%d,%s", 3246,a);
printf("buf is %s\n", buf);
温馨提示:a对应的应该是%d而不是%s
4、还有下面这种错误,我只能意会不知道怎么来描述。现在给出错误的代码和正确的代码的例子。大家自己看吧~~
错误的代码
char buf[15];
char a1[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};
char a2[] = {'H', 'I', 'J', 'K', 'L', 'M', 'N'};
sprintf(buf, "%s%s", a1, a2); //出现乱码,得出的结果并非我们所需要的
printf("buf is %s\n", buf);
正确的代码
char buf[15];
char a1[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};
char a2[] = {'H', 'I', 'J', 'K', 'L', 'M', 'N'};
sprintf(buf, "%.7s%.7s", a1, a2);//产生:"ABCDEFGHIJKLMN"
printf("buf is %s\n", buf);
用标准c++实现string与各种类型之间的转换
这个类在头文件中定义, < sstream>库定义了三种类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。另外,每个类都有一个对应的宽字符集版本
收藏 0赞 0分享
C/C++指针小结
要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区
收藏 0赞 0分享
C++ 类的静态成员深入解析
在C++中类的静态成员变量和静态成员函数是个容易出错的地方,本文先通过几个例子来总结静态成员变量和成员函数使用规则,再给出一个实例来加深印象
收藏 0赞 0分享
C++类的静态成员初始化详细讲解
通常静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域操作符来指出静态成员所属的类.但如果静态成员是整型或是枚举型const,则可以在类声明中初始化
收藏 0赞 0分享
C++类静态成员与类静态成员函数详解
静态成员不可在类体内进行赋值,因为它是被所有该类的对象所共享的。你在一个对象里给它赋值,其他对象里的该成员也会发生变化。为了避免混乱,所以不可在类体内进行赋值
收藏 0赞 0分享
C++中的friend友元函数详细解析
友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类。友元函数的特点是能够访问类中的私有成员的非成员函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上与普通函数一样
收藏 0赞 0分享
C++ explicit关键字的应用方法详细讲解
C++ explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐式的呢?下面就让我们一起来看看这方面的知识吧
收藏 0赞 0分享
教你5分钟轻松搞定内存字节对齐
随便google一下,人家就可以跟你解释的,一大堆的道理,我们没怎么多时间,讨论为何要对齐.直入主题,怎么判断内存对齐规则,sizeof的结果怎么来的,请牢记以下3条原则
收藏 0赞 0分享
查看更多