snprintf函数的使用(Windows和Linux下的区别)
2015-05-08 09:41
543 查看
原文地址:http://yutuo.net/archives/e4320fe0f7645176.html
在C语言中,printf表示把字符串格式化输出到终端。sprintf表示把字符串格式化输出到另一个字符串。而snprintf表示把字符串格式化之后,输出指定位数到新的字符串。
我们看下面一段代码。
#include <stdio.h>
#define COPY_LENGTH 5
int main() {
char buff[100] = {0};
int result = snprintf(buff, COPY_LENGTH, "ABCDEF");
printf("%d, %s\n", result, buff);
}
我在Windows环境编译执行(我的编译环境是:Win7x64 ,gcc 4.8.3),执行结果为-1, ABCDE。
然后把这段代码放到Ubuntu里编译执行(我的编译环境是:Ubuntu Desktop 10.04,gcc 4.8.2),执行结果为6, ABCD。
在网上找了一下原因,在Linux C语言里其定义应该如下:
int snprintf(char *restrict buf, size_t n, const char * restrict format, ...);
函数说明:最多从源串中拷贝 n - 1 个字符到目标串中,然后再在后面加一个 0 。所以如果目标串的大小为 n 的话,将不会溢出。
函数返回值:若成功则返回欲写入的字符串长度,若出错则返回负值。
但在Windows平台,用snprintf只是引用_snprintf函数而已。_snprintf的定义如下:
int _snprintf(char *buffer, size_t count, const char *format [, argument] ...);
函数说明:
如果格式化后的字符串(源串)长度小于或者等于count,则拷贝源串到buffer,并返回源串长度。
如果格式化后的字符串(源串)长度大于count,则拷贝源串的前count个字符到buffer,并返回一个负数。
所以说,_snprintf函数最多可以比源串中拷贝 n 个字符到目标串中,有可能不会在后面加0。所以会出现上面的问题。如果想要使两者相同,可以
在代码中直接把最后一位设置成0,这样两个平台就是一样的结果了。当然在实际应用中,可能根据要实现的功能,如何设置要自己判断。
比如,如果只是把最后一位设置为0,上面的代码可以改成:
#include <stdio.h>
#define COPY_LENGTH 5
int main() {
char buff[100] = {0};
snprintf(buff, COPY_LENGTH, "ABCDE");
buff[COPY_LENGTH - 1] = 0;
printf("%s\n", buff);
}
在C语言中,printf表示把字符串格式化输出到终端。sprintf表示把字符串格式化输出到另一个字符串。而snprintf表示把字符串格式化之后,输出指定位数到新的字符串。
我们看下面一段代码。
#include <stdio.h>
#define COPY_LENGTH 5
int main() {
char buff[100] = {0};
int result = snprintf(buff, COPY_LENGTH, "ABCDEF");
printf("%d, %s\n", result, buff);
}
我在Windows环境编译执行(我的编译环境是:Win7x64 ,gcc 4.8.3),执行结果为-1, ABCDE。
然后把这段代码放到Ubuntu里编译执行(我的编译环境是:Ubuntu Desktop 10.04,gcc 4.8.2),执行结果为6, ABCD。
在网上找了一下原因,在Linux C语言里其定义应该如下:
int snprintf(char *restrict buf, size_t n, const char * restrict format, ...);
函数说明:最多从源串中拷贝 n - 1 个字符到目标串中,然后再在后面加一个 0 。所以如果目标串的大小为 n 的话,将不会溢出。
函数返回值:若成功则返回欲写入的字符串长度,若出错则返回负值。
但在Windows平台,用snprintf只是引用_snprintf函数而已。_snprintf的定义如下:
int _snprintf(char *buffer, size_t count, const char *format [, argument] ...);
函数说明:
如果格式化后的字符串(源串)长度小于或者等于count,则拷贝源串到buffer,并返回源串长度。
如果格式化后的字符串(源串)长度大于count,则拷贝源串的前count个字符到buffer,并返回一个负数。
所以说,_snprintf函数最多可以比源串中拷贝 n 个字符到目标串中,有可能不会在后面加0。所以会出现上面的问题。如果想要使两者相同,可以
在代码中直接把最后一位设置成0,这样两个平台就是一样的结果了。当然在实际应用中,可能根据要实现的功能,如何设置要自己判断。
比如,如果只是把最后一位设置为0,上面的代码可以改成:
#include <stdio.h>
#define COPY_LENGTH 5
int main() {
char buff[100] = {0};
snprintf(buff, COPY_LENGTH, "ABCDE");
buff[COPY_LENGTH - 1] = 0;
printf("%s\n", buff);
}
相关文章推荐
- snprintf函数使用(Windows与Linux版本)
- linux下和windows 下 snprintf函数的区别
- snprintf函数使用(Windows与Linux版本)
- 为什么snprintf比sprintf更安全?(另外,请注意, Windows和Linux中的snprintf函数有区别)
- 为什么snprintf比sprintf更安全?(另外,请注意, Windows和Linux中的snprintf函数有区别)
- Linux中mkdir函数与Windows中_mkdir函数的区别
- Linux下C函数snprintf的使用
- C++成员函数实现在类定义中与在类定义外的区别(Windows下直接使用g++)
- linux的时间管理(与驱动程序相关,非应用程序使用)内核和普通系统函数和使用c语言库的区别
- 【linux开发】IO端口和IO内存的区别及分别使用的函数接口
- Linux and Windows snprintf区别
- Linux and Windows snprintf区别
- Linux and Windows snprintf区别(zz)
- C语言中system()函数在windows和linux下的使用
- 区别于windows,Linux下 结构体指针应正确使用,否则易引发错误
- windows平台下使用open,read等函数易错点及与fread等区别
- linux中sleep()和usleep()函数的使用和区别
- linux中fork()和vfork()函数的使用和区别
- boost read_xml() 函数windows和Linux下使用总结
- windows和linux下Select()函数的区别