在C++中使用变量作为system()输入WITHOUT c_str()

jav*_*web 1 c++ windows system

这不是"为什么简单system(variable)不起作用"之类的重复.

该解决方案只是将字符串存储到c_str()可转换的变量,然后只需调用: system(variable.c_str())

但是,我正在寻找一种方法来做到这一点,而无需c_str() 直接调用.

所以我尝试过类似的东西

class systemRunner{
    private:
        stringstream prepareStream;
    public:
        void setProgram( string s ){
            prepareStream.str(""); // empty stream
            prepareStream.clear(); // reset stream - !IMPORTANT!
            prepareStream << "\"" << s << "\"";
        }
        void appendParam( string s ){ this->prepareStream << " " << s; }
        void appendParam( int i ){    this->prepareStream- << " " << i; }
        const char* getSystemRunCString(){
            //const std::string s = ;
            return this->prepareStream.str().c_str();
        }

};
Run Code Online (Sandbox Code Playgroud)

人们会认为这将是enaugh:

system ( systemRunner->getSystemRunCString() )
Run Code Online (Sandbox Code Playgroud)

但它失败了,相反.编译很好,但是当像这样调用system()时 - 系统说它无法找到指定的路径.

但是当我恢复它并c_str()在直接系统调用中使用时,例如:

string tmp = (string)systemRunner->getSystemRunCString();
system( tmp.c_str() );
Run Code Online (Sandbox Code Playgroud)

这很好用.

人们预计,如果我创建它返回同样的事情的方法c_str(),
这是const char*,我会得到相同的结果,但我没有得到它...

我甚至试图将两个输入都放在system()文件中但是在文件中 - 相同的结果,所以它存储相同的信息...

我错过了什么吗?这甚至可能吗?


PS:我说的是system()在Windows 7控制台应用程序中使用...

编辑:那么@ravi是正确的导致这个特定的例子失败的原因 - 但是主题的答案是什么 - 在标题中 - 是否可以在不直接调用c_str()的情况下调用系统(变量)?:)

rav*_*avi 5

return this->prepareStream.str().c_str();
Run Code Online (Sandbox Code Playgroud)

会返回const char*.该指针将是指向字符串类使用的内部字符指针的指针.通过此操作,您可以访问字符串的内部数据,但由于它是const指针,您将无法修改它的内容.

这里发生的事情是在执行此函数后,字符串(您仍然持有其内部数据)超出范围.所以,你只是在处理其字符串超出范围的句柄.

你永远不应该依赖于此.

  • 这回答了"我错过了什么吗?"的问题. (2认同)