Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将参数传递给字符串时,将字符串写入char_C++_String - Fatal编程技术网

C++ 将参数传递给字符串时,将字符串写入char

C++ 将参数传递给字符串时,将字符串写入char,c++,string,C++,String,我有以下代码: char szBuf[256] = ""; std::string szFmt = "You have recieved %s item." string szName = "Fork"; snprintf(szBuf, sizeof(szBuf), szFmt.c_str(), szName); 我尝试将szFmt与szBuf结合起来,同时根据将szFmt与szName结合起来。然而,当我在win10中执行此代码时,我得到了一个奇怪的输出: 您已收到LÃý项目 当我尝试在OS

我有以下代码:

char szBuf[256] = "";
std::string szFmt = "You have recieved %s item."
string szName = "Fork";
snprintf(szBuf, sizeof(szBuf), szFmt.c_str(), szName);
我尝试将szFmt与szBuf结合起来,同时根据将szFmt与szName结合起来。然而,当我在win10中执行此代码时,我得到了一个奇怪的输出:

您已收到LÃý项目

当我尝试在OSX El Capitan中执行代码时,我得到以下错误

无法通过变量函数传递非平凡类型“string”的对象; 调用将在运行时进行

那么问题是什么,我该如何解决


注意:我勾选了问题,但在答案中,他们直接传递“Fork”,这在我身上也起作用;但是,当我将其作为szName传递时,它不起作用

在评论(
ostringstream
)中提到了更好的解决方案,但为了进一步的教育价值,我将在这里解决眼前的问题

Varargs(函数的
printf
系列可以接受可变数量的参数的机制)不像其他函数那样进行严格的类型检查。在本例中,
snprintf
希望字符串中有一个
char*
,但您正在传递
szName
,它是一个
string
对象。因此,您还需要调用
.c_str()

snprintf(szBuf, sizeof(szBuf), szFmt.c_str(), szName.c_str());

评论(
ostringstream
)中提到了更好的解决方案,但为了进一步的教育价值,我将在这里解决眼前的问题

Varargs(函数的
printf
系列可以接受可变数量的参数的机制)不像其他函数那样进行严格的类型检查。在本例中,
snprintf
希望字符串中有一个
char*
,但您正在传递
szName
,它是一个
string
对象。因此,您还需要调用
.c_str()

snprintf(szBuf, sizeof(szBuf), szFmt.c_str(), szName.c_str());

使用将简化事情,特别是因为它比继承自C的
printf
函数更安全,而且它可以处理所有标准类型,并且输出操作符有适当的重载
使用将简化事情,特别是因为它比从C继承的
printf
函数更安全,而且它可以处理所有标准类型,并且输出操作符
有适当的重载,所以第二个参数应该是目标缓冲区的大小。在您的情况下,它应该是
sizeof szBuf
。当你得到一个代码的大小:STD::String 对象时,你得到了实际的大小:<代码> STD::String 对象,而不是它包含的字符串的大小(例如,是代码> SZFMT.LimthHe)/C++ >。code>sizeof(szFmt)
永远不会给出字符串的长度;这将是
szFmt.length()
。但实际上,只需完全删除
snprintf
并使用流即可。@Someprogrammerdude感谢您指出,我已经纠正了它,但正如您可能猜到的那样,问题仍然存在。至于您的问题,我建议您改为查看。您忘记了
.c_str()
szName的一部分。第二个参数应该是目标缓冲区的大小。在您的情况下,它应该是
sizeof szBuf
。当你得到一个代码的大小:STD::String 对象时,你得到了实际的大小:<代码> STD::String 对象,而不是它包含的字符串的大小(例如,是代码> SZFMT.LimthHe)/C++ >。code>sizeof(szFmt)
永远不会给出字符串的长度;这将是
szFmt.length()
。但实际上,只需完全删除
snprintf
并使用流即可。@Someprogrammerdude感谢您指出,我已经纠正了它,但正如您可能猜到的那样,问题仍然存在。至于您的问题,我建议您改为进行研究。您忘记了
szName
.c_str()
部分。
std::cout << "The output is " << ostr.str() << '\n';
// Use `strncpy` to not overflow the destination buffer
std::strncpy(szBuf, ostr.str().c_str(), sizeof szBuf - 1);

// Remember that `strncpy` might not terminate the destination, so do it explicitly
szBuf[sizeof szBuf - 1] = '\0';