質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

2754閲覧

Systemコマンド実行時に変数の値を使用して処理を行いたい

lifeguard

総合スコア16

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/05/20 02:39

前提・実現したいこと

Visual Studioを使用し、C++で実験を行っております。
systemコマンド実行時に、変数ipの値を使用してルーティングを行うツールを作成しているのですが、コマンドの文中にどうやって変数ipの値を使用すればよいのかが分かりません。
初歩的な質問で申し訳ありませんが、解決策をご教授願います。

該当のソースコード

C++

1int ret = 0; 2std::string ip = "192.168.10.10"; 3//192.168.10.20の所に変数ipの値を入れて実行したい 4char *command = "ROUTE -p ADD 192.168.10.20 MASK 255.255.255.240 10.20.20.20"; 5ret = system(command); 6 if (ret != 0) 7 { 8  printf("error ! \n"); 9 }

試したこと

文字列出力時と同様の方法で行けるかと思い
char* command = ("ROUTE -p ADD %d MASK 255.255.255.240 10.20.20.20",ip);
と書き換えてみましたが、上手く動作しませんでした。

補足情報(FW/ツールのバージョンなど)

Visual Studio 2019

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2019/05/20 02:45

うまく動作しないとは、どうなったんでしょうか。 エラーが出るならエラーメッセージを提示しましょう
lifeguard

2019/05/20 03:45

情報が足りず申し訳ありません。 上記を実行したところ、ビルド時に下記2点のエラーが発生しました。 E0413 "std::string" から "char *" への適切な変換関数が存在しません C2440 '初期化中': 'std::string' から 'char *' に変換できません。 リンク先を読んでみたのですが、型が違うということは理解できましたが、どのように対処すればよいのかが不明でした。
guest

回答2

0

C++

1std::string ip = "192.168.10.10"; 2ret = system(("ROUTE -p ADD " + ip + " MASK 255.255.255.240 10.20.20.20").c_str());

投稿2019/05/20 10:31

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lifeguard

2019/05/21 10:41

ご回答ありがとうございました。 y_waiwaiさんの方が、書き込み時間が早かったため、そちらをBAとさせていただきました。 また、機会がありましたら、ご協力の程宜しくお願いします。
guest

0

ベストアンサー

char* command = ("ROUTE -p ADD %d MASK 255.255.255.240 10.20.20.20",ip);

そりゃこれではコンパイルできないでしょう。
sprintf などを使うとか

投稿2019/05/20 02:52

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lifeguard

2019/05/20 07:07

アドバイスありがとうございます。 頂いたアドバイスを元に下記の通り、書き直して実行してみました。 int ret = 0; std::string ip = "192.168.10.10"; char command[200]; char* sprintf(command,ROUTE -p ADD %s MASK 255.255.255.240 10.20.20.20",ip) ret = system(command);  if (ret != 0)  {   printf("error ! \n");  } その結果、下記3つのエラーが発生してしまいました。 1.')'が必要です 2.'初期化中':'initializer list'から'char'に変換できません 2についてはキャストエラーとのことだったので、こちらで調べてみて解決しようとしたのですが、一向に解決しないため、申し訳ありませんが、またヒントを頂けないでしょうか。
y_waiwai

2019/05/20 07:19

sprintfに書き方間違ってます ・頭の char* はつけてはいけません ・第2引数、文字列になってません ・セミコロン抜けてます
lifeguard

2019/05/20 08:37

ご指摘ありがとうございます。また、ケアレスミスで申し訳ありません。 頂いた指摘事項を修正し、実行したところ下記3つのエラーが発生しました。 1.型"char*"の値を使用して、型"char"のエンティティを初期化することができません。 2.')'が必要です 3.'初期化中':'initializer list'から'char'に変換できません 改めてsprintfの使い方についてネットで確認しましたが、書式は特に間違ってないように思えます。 お手数ですが、再度ヒントを頂けないでしょうか。 (修正後)  int ret = 0;  std::string ip = "192.168.10.10";  char command[200];  char sprintf(command,"ROUTE -p ADD %s MASK 255.255.255.240 10.20.20.20",ip);  ret = system(command);   if (ret != 0)   {    printf("error ! \n");   }
y_waiwai

2019/05/20 09:58

いぜん間違ってます ・sprintf の前に型名を書かない。型名を書いてしまうと、プロトタイプ宣言とみなされます ということで、 sprintf(command,"ROUTE -p ADD %s MASK 255.255.255.240 10.20.20.20",ip.c_str()); でどうぞ
lifeguard

2019/05/21 10:40

教えて頂いた内容で、期待通りの動作が確認できました。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問