ページ 11

system関数

Posted: 2010年10月03日(日) 15:19
by みけCAT
開発環境はDev-C++4.9.9.2、コンパイラはデフォルトです。
この環境でC言語のCUIプログラムの実行結果が見えるように、
プログラムを起動してポーズするプログラムを書きました。
ほとんどうまくいったのですが、コマンドラインとして「"」を含むものを入力すると、
エラーが出ます。
1)「runpause.exe "D:\zikken\test.exe" /c」をコマンドプロンプトに打ち込んで起動しました。
2)コマンドラインとして「"1"」を入力しました。
3)以下のエラーが出ました。
'D:\zikken\test.exe" "1' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
ソースコード
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc,char* argv[/url]) {
    char cmd[10000];
    char runcmd[10000];
    int i;
    if(argc<2)return 1;
    strcpy(runcmd,"\"");
    strcat(runcmd,argv[1]);
    strcat(runcmd,"\"");
    if(argc>=3) {
        fprintf(stderr,"コマンドラインを入力してください。\n");
        fgets(cmd,sizeof(cmd),stdin);
        for(i=0;cmd!=0;i++) {
            if(cmd==0x0A || cmd==0x0D)cmd=0;
        }
        strcat(runcmd," ");
        strcat(runcmd,cmd);
    }
    system(runcmd);
    system("pause");
    return 0;
}

D:\zikken\test.exeのソースコード
#include <stdio.h>

int main(int argc,char* argv[/url]) {
    int i;
    for(i=0;i<argc;i++) {
        printf("%s\n",argv);
    }
    return 0;
}


(追記)解決方法がわかる方がいらっしゃいましたら教えていただければ幸いです。 画像

Re:system関数

Posted: 2010年10月03日(日) 15:27
by シエル
1ってtest.exeに対するコマンドラインですか?

だったら↓のように""で囲まなければいけないのではないでしょうか?
"D:\zikken\test.exe 1"

あまり自信ないので、間違ってたらすみません。。。

Re:system関数

Posted: 2010年10月03日(日) 15:39
by みけCAT
コマンドラインを入力するところで「"1"」ではなく「1」と入力すると正常に動作します。
この時、system関数に渡すパラメータは
「"D:\zikken\test.exe" 1」となっているはずです。

Re:system関数

Posted: 2010年10月03日(日) 16:04
by アビゲイル
D:\zikken にパスが通ってないとか。

(追記)ですよね 画像

Re:system関数

Posted: 2010年10月03日(日) 16:06
by みけCAT
>D:\zikken にパスが通ってないとか。
パスというのは、この場合、
たとえばD:\zikkenにパスを通すとtest.exeと入力するだけで起動できるというものですよね。
違っていたらすみません。

もしそうだとすると、この場合「D:\zikken\test.exe」というように、
フルパスで指定しているから関係ない気がしますが、どうでしょうか?

Re:system関数

Posted: 2010年10月03日(日) 16:18
by シエル
とりあえず、コマンドライン引数が1だったら
"D:\zikken\test.exe 1"という文字列が作られるようにして、
system関数に渡せるようにすれば、動くんじゃないかと。 画像

Re:system関数

Posted: 2010年10月03日(日) 16:28
by みけCAT
なぜかはわかりませんが動きました。
コマンドライン引数に「"1 2 3"」などの「"」で囲まれた文字列を入力しても動作します。
実行するファイルを「D:\The test\test.exe」というスペースを含んだものにしても動作します。
ありがとうございました。
<pre#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc,char* argv[/url]) {
char cmd[10000];
char runcmd[10000];
int i;
if(argc<2)return 1;
strcpy(runcmd,"\"\"");
strcat(runcmd,argv[1]);
strcat(runcmd,"\"");
if(argc>=3) {
fprintf(stderr,"コマンドラインを入力してください。\n");
fgets(cmd,sizeof(cmd),stdin);
for(i=0;cmd!=0;i++) {
if(cmd==0x0A || cmd==0x0D)cmd=0;
}
strcat(runcmd," ");
strcat(runcmd,cmd);
}
strcat(runcmd,"\"");
system(runcmd);
system("pause");
return 0;
}
[/pre]