带有%s和std :: string的sprintf给出了乱码

Thr*_*iag 1 c++ string printf variadic-functions stdstring

在以下代码中:

#include <string>
using namespace std;

int main(){
    char command[300];
    string stringz = "mystringy";
    sprintf(command,"echo \"something with a string %s\" ", stringz);
    system(command);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么是输出

something with a string 8?
Run Code Online (Sandbox Code Playgroud)

而不是预期的

something with a string mystringy
Run Code Online (Sandbox Code Playgroud)

一个愚蠢的问题,但我无法找到答案.

Chr*_*son 6

printf的'%s'修饰符需要a char*而不是a std::string.

你可以写:

sprintf(command,"echo \"something with a string %s\" ", stringz.c_str());
Run Code Online (Sandbox Code Playgroud)

这给你一个a const char*的内容std::string.这显示了一个主要的缺点sprintf- 没有类型检查!


Ded*_*tor 5

sprintf格式%s需要一个 C 字符串,它是一个以 0 结尾的数组char,而不是一个std::string.

stringz.c_str()从 C++11 开始&stringz[0]stringz.data()有几种方法可以获取 std::string 持有的 C 字符串。