2014-04-19 173 views
-1

我试图使用C++模块内部的snprintf,使用此代码:C++:从'const char *'无效转换为'size_t'?

snprintf(err, "%s%s", "Fatal Error! ", err); 

,但我得到的, 当“从‘为const char *’到‘的size_t’转换无效”错误编译我的程序,那么如何解决这个问题呢?谢谢。

+2

您是否阅读过snprintf的文档,特别是参数? http://en.cppreference.com/w/cpp/io/c/fprintf –

+0

int snprintf(char * str,size_t size,const char * format,...); –

+1

即使添加缓冲区的大小,也不能将'err'作为参数传递给'...'以进行格式化和作为输出缓冲区。 –

回答

2

snprintf原型如下:

int snprintf(char *str, size_t size, const char *format, ...) 

论证两者应该是你的字符缓冲区(即err),在这里有您的格式字符串的最大尺寸。它用作“更安全”sprintf,因为该函数不会将多于size字节的数据写入缓冲区,因此可以采用某种方式来防止溢出。在这种情况下,我以为你只是想使用标准sprintf,其原型如下:

int sprintf(char *str, const char *format, ...); 
+0

是啊,你说得对,我在snprintf和sprintf之间感到困惑,我必须用sprintf来代替,谢谢,真的有帮助! – user3464495

+0

不用担心!如果有帮助,请标记为答案。尽管Daniel Frey在帖子评论中提到过,但你不能写入“err”并同时读取它。从逻辑上考虑它,它会尝试写入它来编写“致命错误”字符串,然后从中读取并写入其余字符,而不删除NULL结束符。我实际上并不知道会发生什么,但我的直觉是它会写出“致命的错误!”无限次数,直到它segfaults。 – slugonamission

+0

我明白了,好的。 – user3464495

1

在C这个函数声明如下way

int snprintf(char * restrict s, size_t n, const char * restrict format, ...); 

正如你看到的第二个参数的类型是size_t但在函数的调用时使用的第二个参数的类型是const char *

snprintf(err, "%s%s", "Fatal Error! ", err); 

所以你只需使用函数不正确。

第二个参数指定您要在变量中读取多少个字符。通常n被设置为由s指向的字符数组的大小。

+0

为C原型+1。输出为'char * restrict'意味着使用'err'作为输入和变量长度参数之一是未定义的行为。 –

+0

@David Hammen你是对的。 –

相关问题