2014-09-29 60 views
2

我想將一個字符串傳遞給system()shell命令函數。我想爲一個連接字符串傳遞到它像這樣:如何使用std :: string作爲system()調用的命令?

string parameters = "Doug"; 
system("ps -ef|grep " + parameters); 

它不斷給我的錯誤,因爲系統()採用一個char *。我將如何去關於system()函數的工作。我試着把parameters.c_str()但不起作用。謝謝!

+2

在將字符串傳遞給shell之前,使用帶有串聯字符串(command + parameters)的c_str() – venki421 2014-09-29 18:46:28

回答

5

你需要調用c_str()在連接結果:

system(("ps -ef|grep " + parameters).c_str()); 

(注意括號)

+0

謝謝!成功了! – 2014-09-29 18:47:06

+0

這爲什麼有效? c_str()返回'const char *',而不是'char *'。 – Basilevs 2014-09-29 18:47:19

+2

@Basilevs:'c_str()'返回一個'const char *','system()'則帶一個'const char *':http://linux.die.net/man/3/system – NPE 2014-09-29 18:48:47

2

因爲系統()採用一個char *。

system()需要char*參數(分別爲const char*)。你可以這樣做以下方式,通過構建完整的命令行傳遞第一

string cmd = "ps -ef|grep "; 
cmd += parameters; 

system(cmd.c_str()); 

好,因爲它是proven@NPE's answer有一個重載+運營商std::string,支持以下簽名

std::string operator+(const char*, const std::string&); 

因此

system(("ps -ef|grep " + parameters).c_str()); 

可以由編譯器解決,作爲+操作的結果而具有臨時std::string實例,並將該臨時結果實例的c_str()值作爲system()函數所需的const char*參數傳遞。

1

如果你要做到這一點非常多(在所有),我會考慮寫一個接受std::string作爲參數的system過載:

void system(std::string const &s) { 
    std::system(s.c_str()); 
} 

然後將代碼的其餘部分可以創建std::string S和它們傳遞到system沒有任何問題,所以你的原始代碼:

string parameters = "Doug"; 
system("ps -ef|grep " + parameters); 

...編譯和運行就好了。

相關問題