0

system() が文字列変数でコマンドを実行するのに問題があります。

ostringstream convert;
convert << getSeconds(hours);
string seconds = convert.str();    /* converts the output of 'getSeconds()' into
                                      a string and puts it into 'seconds' */

string cmd = "shutdown /s /t " + seconds;

system(cmd);

getSeconds()時間単位の int を取り、それを秒単位に変換して、秒単位の int を返すだけです。に達するまで、すべてが正常に実行され、エラーは発生しませんsystem(cmd);。次に、コンパイラは次のエラーを吐き出します。

error: cannot convert 'std::string {aka std::basic_string<char>}' to
'const char*' for argument '1' to 'int system(const char*)'

これが私のインクルードです:

#include <iostream>
#include <string>
#include <cstdlib>
#include <sstream>
4

2 に答える 2

5

これはすでにコメントで回答されていることは知っていますが、実際には説明されていません:

system関数は C 関数です。C++ スタイルの文字列を「理解」しません。そのためには、関数を使用する必要がありc_str()ます。つまり、必要ですsystem(cmd.c_str());

これは、C++ で引き続き使用できる多数の C スタイル関数に適用されます。これは、C++ の主な機能の 1 つは、従来の C コード (大部分) を C++ で引き続き使用できるためです。したがって、同じことが文字列を取るほとんどすべての C スタイルの関数に適用されprintf("cmd=%s", cmd.c_str());ます。コマンドが何であるかを出力します。

独自のラッパー関数を作成することも可能です:

int system(const std::string &cmd)
{
   return system(cmd.c_str());
}

これで、残りのコードsystemで通常の C++ スタイルの文字列を使用できます。

于 2013-07-24T23:44:51.220 に答える
2

system は std::string ではなく C 文字列を取るため、最初に c_str 関数を呼び出す必要があります。

system(cmd.c_str());
于 2013-07-24T23:44:38.973 に答える