system関数がうまくいかない

このQ&Aのポイント
  • DOSプログラムのBCCでコマンドライン引数を含む自身の呼び出しについての問題です。
  • system関数でコマンドライン引数を含む自身の呼び出しを行う部分が正常に動作しません。
  • 改善のためには、strcpyやstrcatの順序を調整する必要があります。
回答を見る
  • ベストアンサー

system関数がうまくいかない

BCCでコマンドライン引数を持ったDOSのプログラムを作っています。 プログラム内で自身を呼び出すために char path[MAX_PATH]; char str[MAX_PATH]; GetModuleFileName(NULL, path, MAX_PATH); strcpy(str, "\""); strcat(str, path); strcat(str, "\""); system(str); strcat(str, " \"コマンドライン引数\""); system(str); と書いたのですが、下だけうまくいきません。 どこを改善すればうまくいくようになるでしょうか? 分かる方がいらっしゃいましたら回答お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • maku_x
  • ベストアンサー率44% (164/371)
回答No.2

例えば、cmd.exe で hogehoge.bat を動かそうとすると、このプログラムでは、最初、 system("cmd.exe"); となりますが、引数を付け加えた段階で、 system("cmd.exe" "hogehoge.bat"); と等価になってしまいますので、 system("cmd.exe hogehoge.bat"); となるようにプログラムを修正する必要があると思います。

mumei_
質問者

お礼

回答していただいた通りに修正したところ、期待通りの動作が確認できました。 素早い回答と解説、ありがとうございました。

その他の回答 (1)

  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.1

> と書いたのですが、下だけうまくいきません。 「うまくいきません」だけでは、正確な回答ができないです。 エラーメッセージが出たのでしたら全文を載せるなどして、 具体的な状況をお伝え願います。

mumei_
質問者

補足

説明不足で大変失礼しました。 ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。 と表示されます。 ところが、下で実行したコマンドをコピーして直にコマンドプロンプトに貼り付けると、問題なく実行されます・・・

関連するQ&A

  • strcatについて

    こんな感じでstrcatを使ってみましたが、AfxMessageBox( aa );で表示させてみるとaaとbbの連結させたものではなく、bbが表示されてしまいます。 どうしてなのでしょうか? void forder(CArray<CString,CString>* p_arrayTest){ char str[2][256] ; char *tp[2]; strcpy(str[1],(*p_arrayTest)[1]); tp[1] = strtok( str[1], " " ); char aa[40] , bb[40] ; strcpy( aa , "C:\\test\\" ); strcpy( bb , tp[1] ); strcat( aa , bb ) ; AfxMessageBox( aa ); }

  • strcat関数

    学校の課題で strcat関数と全く同じ働きをするmy_strcatを実装せよ という課題がでています。 strcatは char* strcat(char *dest, const char *str) で表され、文字列 strを文字列 dest に合成して 合成された新しい文字列として dest を返します。 例えば、dest = Japan, str = Korea だったら, 関数処理後に、 dest = JapanKorea を戻り値とします。 ********************************************* my_strcat実装について 実装段階で一番の問題になるのが、文字列のサイズです。 とりあえず、私の書いたコードを示します↓ char* my_strcat(char *dest, const char *src) { int i=0; int j=0; while(*dest) { dest++; i++; } while(*src) { *(dest+i) = src[0]; i++; src++; } *(dest+j) = src[0]; //put null at the end of dest return dest; } 試しにdest=Japan,str=Koreaでやってみたのですが、動きませんでした。 原因はdest の文字サイズを無視した無理やりなりな実装だと考えます。 C言語では文字のサイズを一度宣言したら、変えられないと思うので、困っています。 どなたかアドバイスをいただけないでしょうか。 よろしくお願いします

  • Unix 系 OS の標準的コマンドの一つである ls をまねたプログ

    Unix 系 OS の標準的コマンドの一つである ls をまねたプログラムを作っているのですが、そのことについて質問があります。 コマンド“fl”の引数にディレクトリが指定された場合に、ファイル名の前にディレクトリ名を付加して表示するプログラムをつくっています。 条件として、 ・表示するときは、ファイル名だけでなく指定されたディレクトリ名を ファイル名の前に付加したものを表示(パス表示)する。 ・指定されたディレクトリの最後にスラッシュがない場合でも、スラッシュを付与して表示する。 ・引数へ与えるディレクトリ名として ///home//sakai////hoge////// のように指定した場合も、ls と同様、該当するディレクトリ配下のファイルを表示する。 ・コマンドの引数にディレクトリ名が指定されない場合はカレントディレクトリのファイル名のみ表示し、 ディレクトリ名は付加しない。ただし、ファイルへ付加するディレクトリ名は 余分なスラッシュを除去したものである。 ・文字列と文字列の連結には strcat関数を使用する。 ・余分なスラッシュを除去する部分の実装はmain関数内ではなく、別の関数する。 この条件で途中まで作ってみたのですが、 char pathpath(char *str) { int i,j,flag; char x1[512] = {0}; char x2[512] = {0}; flag = 0; printf("%s\n", str); j = 0; strcpy(x1, str); for(i = 0; i < strlen(x1); i++) { if((x1[i] != '/') && (flag == 0)) { x2[j] = x1[i]; j++; } else if((x1[i] == '/') && (flag == 0)) { x2[j] = x1[i]; j++; flag = 1; } else if((x1[i] == '/') && (flag == 1)) { continue; } else if((x1[i] != '/') && (flag == 1)) { x2[j] = x1[i]; j++; flag = 0; } } if(flag == 0) { strcat(x2, "/"); } strcat(x2, "\0"); printf("%s\n", x2); strcpy(str, x2); return *str; } で、スラッシュ除去する部分まではできたのですが、スラッシュ除去したものをメイン関数に *x = pathpath(argv[i + 1]); と返そうとするとうま返りませんし、strcpy関数を用いて、 strcpy(path[i], pathpath(argv[i + 1])); にしようとするとコンパイルすらうまくできません。 ちなみに、メイン関数の宣言部は、 int main(int argc, char *argv[]) { int i; DIR *dir[argc]; char path[argc][512],*x; struct dirent *de[argc]; struct dirent_cell *cell, *head;

  • reallocの断片化対策について

    初めにお断りしておきたい事があります。 出先で緊急な事でしたので、今即興で書いたソースになります。 Cコンパイル環境が有りませんでしたので、動作確認がとれておりません。 その為、ケアレスミス等有るかもしれませんがご容赦願います。 例として標準入力より文字列を取得する処理を記述しました。 以下の処理でreallocの際の断片化対策となるでしょうか。 (最終的に*strにセットされている領域が断片化されていない事) 実際の処理では1行辺り0~30000文字程の可変長の文字列を読み込む事を想定しております。 C(windows)のみ可でC++は不可になります。 その他、冗長な記述等指摘が有りましたらよろしくお願い致します。 #define MAX_BUF_SIZE 128 int getText(char **str) { char *buf[MAX_BUF_SIZE]; char *tmp = NULL; int tmpsize = 0; if ((tmp = (char*) malloc(1)) == NULL) { return FALSE; } *tmp = '\0'; while (fgets(buf, MAX_BUF_SIZE, stdin) != NULL) { tmpsize += MAX_BUF_SIZE; if ((tmp = realloc(tmp, tmpsize)) == NULL) { free(tmp); return FALSE; } strcat(tmp, buf); } if (*str != NULL) { free(*str); } if (*str = (char*) malloc(strlen(tmp) + 1) != NULL) { return FALSE; } strcpy(*str, tmp); free(tmp); return TRUE; }

  • 構造体が戻り値の関数についてわかりません

    問題文:文字列を保存する構造体word_pairを下記の様に定義する。 typedef struct word_pair{ char longer_word[10]; char shorter_word[10]; char combined_word[20]; int longer_word_length; int shorter_word_length; }word_pair_t; この構造体を新たに作成し、データをセットして返す関数 word_pair_t create_word_pair(char *a, char *b); を作成せよ。create_word_pairは以下の仕様を満たす。 create_word_pairは2つの文字列a,bを比較し、長い文字列をlonger_wordに、短い文字列をshorter_wordに代入する。また、これらの長さが同じ場合には辞書的に後ろのものをlonger_wordに、前のものをshorter_wordに代入する。もし、a,bがまったく同じ文字列であれば、エラーメッセージを出力した上で、longer_wordに入力された文字列をshorter_wordに空の文字列を代入する。またcombined_wordにはlonger_word とshorter_wordをスペース区切りで結合したものを代入する。 標準入力から文字列を2つ読み取り、create_word_pairを用いて、新たにそれらのデータが代入された構造体を作成した後に、これらのメンバ変数を全て、標準出力に表示するプログラムを作成せよ。 という問題で、とりあえず自分で細かい条件は無視して文字列を標準入力してから構造体のメンバに文字を格納するところまでやろうとしたのですが、strcpyするのに型が違うとコンパイルエラーが出たのですが、型は一緒だと私は思っているため、なぜ違うのかわかりません。 また辞書的に後ろ前をif文でどのように表現すればいいのかと、文字列結合にstrcatを使うと思うのですが、結合の合間にスペースをいれる方法が分かりません。以下自分のコード。 #include<stdio.h> #include<string.h> #define max 50 typedef struct word_pair{ char longer_word[10]; char shorter_word[10]; char combined_word[20]; int longer_word_length; int shorter_word_length; }word_pair_t; word_pair_t create_word_pair(char *a, char *b); int main() { char a[max],b[max]; word_pair_t *str; printf("文字列を2つ入力してください。\n"); printf("1つ目:"); scanf("%s\n",a); printf("2つ目:"); scanf("%s\n",b); create_word_pair(a,b); printf("長い方の文字列%s\n",str->longer_word); printf("短い方の文字列%s\n",str->shorter_word); printf("連結した文字列%s\n",str->combined_word); printf("長い方の文字列の長さ%d\n",str->longer_word_length); printf("短い方の文字列の長さ%d\n",str->shorter_word_length); return 0; } word_pair_t create_word_pair(char *a, char *b) { int d, e; char c[max]; word_pair_t *str; d = strlen(a); e = strlen(b); if(d > e){ strcpy(str->longer_word, a); strcpy(str->shorter_word, b); c = strcat(a,b); strcpy(str->combine_word, c); strcpy(str->longer_word_length, d); strcpy(str->shorter_word_length, e); } if(d < e) { strcpy(str.longer_word, b); strcpy(str.shorter_word, a); c = strcat(a,b); strcpy(str.combine_word, c); strcpy(str.longer_word_length, e); strcpy(str.shorter_word_length, d); } }

  • 関数化

    #include <ctype.h> #include <string.h> #include <stdlib.h> void swap(char p[], char q[]); char *get(char *str, char buf[], int line, int field); typedef struct { int number; char *class_type; char* name; char *subject; } my; my *data; int main(int argc, char* argv[]) { FILE *fp; int field = 0, line = 0; char buf[1000], *str; char *bufG; int line2 = 0; if((fp=fopen("test3.csv","r"))==NULL){ printf("ファイルが開けません"); } while(fgets(buf, 1000, fp) != NULL){ line2++; } fclose(fp); printf("%d\n", line2); if((fp=fopen("test3.csv","r"))==NULL){ printf("ファイルが開けません"); } data = (my *)malloc(sizeof(my) * line2); while(fgets(buf,1000,fp) != NULL){ str = buf; while(*str != '\0'){ bufG = get(str, buf, line, field); switch(field){ case 0: data[line].number = atoi(bufG); break; case 1: data[line].class_type = (char *)malloc(strlen(bufG) +1); strcpy(data[line].class_type, bufG); break; case 2: data[line].name = (char *)malloc(strlen(bufG) + 1); strcpy(data[line].name, bufG); break; case 3: data[line].subject =(char *)malloc(strlen(bufG) + 1); strcpy(data[line].subject, bufG); break; } str++; field++; } line++; field = 0; } fclose(fp);     for(int m = 1; m < line; m++){ printf("%d\n", data[m].number); printf("%s\n", data[m].class_type); printf("%s\n", data[m].name); printf("%s\n", data[m].subject);     } return 0; } char *get(char *str, char buf[], int line, int field) { char bufG[1111]; int i; for(i = 0; *str != ',' && *str != '\0' ; i++){ if(*str == '\n'){ bufG[i] = '\0'; } else{ bufG[i] = *str; } str++; } bufG[i] = '\0'; return bufG; } 前回の質問 http://okwave.jp/qa5094929.html で提示していただいたサンプルの関数化をはかりましたが うまくいきません。これを実行すると1しか表示されません。 原因はおそらくポインタだと思いますがどうすればいいのか わかりません。教えて下さい。bufを引数にする意味ないのでは という意見は今の所はとりあえずなしで fieldの値によってbufGが色々とってくる。 例えば1,A,山田,数学の場合 field = 0のときbufGは1 filed=1のときbufGはA field=2のときbufGは山田 filed=3のときbufGは数学という ような値が返ってくるようにしたいです。

  • strncpy後のatoiがおかしい

    こんにちは。 C++をVS2005でやっています。 atoi関数を使っているんですが、10個の配列strにstrncpyをやると値がおかしくなります。 10個目に'\0'を代入させてやってみても駄目でした。 以下にソースを載せます。 #include <string.h> #include <stdlib.h> #include <stdio.h> #include <errno.h> int main( void ) { char string[256]; char str[10]; char *moji = "12345464"; int l; // using template versions of strcpy_s and strcat_s: strcpy(string, "6877897898"); strcat(string, "strcpy_s"); strcat(string, "and"); // of course we can supply the size explicitly if we want to: strcat(string, "strcat_s!"); strncpy(str, string, 10); l = strtol(str,NULL,10);// 値が違う 6877897898にならない printf("str = %d\n", l); l = atoi(moji); printf("moji = %d\n", l); l = atoi(string);// 値が違う printf("string = %d\n", l); printf("String = %s\n", string); getchar(); return 0; } 表示結果 str = 2147483647 moji = 12345464 string = 2147483647 String = 6877897898 mojiは正常に動作しますから、ナル文字が原因なのかと思ってしまいますが。原因がいまいち分かりません。 よろしくお願いします。

  • 引数として二次元配列を利用する方法について(C言語)

    #define PR_SIZE 40 char hp[PR_SIZE][3]; char *initial; initial = "aa,aa"; GetPrivateProfileString("Setting", "hp", initial, strText, 1024, ini_path); initial = strtok(strText, ","); for(i = 0; i < PR_SIZE; i++) strcpy(hp[i], "\0"); for(i = 0; initial != NULL && i < PR_SIZE; i++){   strcpy(hp[i], initial);   initial = strtok(NULL, ","); } という部分を関数化しようとして、 ReadIni_pr(&(pr.hp[0][3]), "hp", "aa,aa"); //関数呼び出し void ReadIni_pr(char *a[], const char* str, char* initial){   char strText[128];   GetPrivateProfileString("Setting", str, initial, strText, 1024, ini_path);   for(int i = 0; i < PR_SIZE; i++)     strcpy(a[i], "\0");   initial = strtok(strText, ",");   for(int i = 0; initial != NULL && i < PR_SIZE; i++){     strcpy(a[i], initial);     initial = strtok(NULL, ",");   } } と書いてみたのですが、第一引数の処理がどうしても上手くいきません できるだけ関数の内部を変更しない形で、上手くいく方法はないでしょうか (インクルードに関しては省略してあります) あと、char sp[PR_SIZE][5];に関しても同様の関数で処理したいのですが、可能でしょうか?

  • OSのコマンドを呼び出すとき、CPUを最大限に使いたい

    OS(ディストリビューション)はUbuntu、言語はC++を用いています。 以下のプログラム: int main(void) { unsigned long int cnt_max=ULONG_MAX; for(unsigned long int i=2;i<=cnt_max;i++){ string str =":"; char c[1024]; strcpy( c, str.c_str() ); FILE *fp = popen(c, "r");・・・※ pclose(fp);・・・※ } } では、確かに実行したいこと(ここでは何もしませんが)が行われます。 ところが、topコマンドで見るとCPUを数%しか用いていません。 ※の部分を消すと、100%使いますので、 どうやらOSのコマンド(ここでは「:」)を実行するときには100%使ってくれないようです。 では、100%使ってくれるようにするにはどうしたらよいでしょうか?

  • プログラム高速化について

    http://oshiete1.goo.ne.jp/qa5810041.html で質問させていただいた者です。 ソースは下ので動いているのですが、北海道近辺の郵便番号を調べようとするとすぐに結果が返ってくるのですが、 沖縄県辺りですと少し時間がかかってしまいます。(わずかな差ですが…) 恐らく、上から1個ずつしらみつぶしに調べているのでそのような結果になっているのはわかるのですが… これを高速化するにはwhile文をいじる必要があると思うのですが、どのようにしたら良いでしょうか? 以下がプログラムになります。 ken_all.csvの場所:http://www.post.japanpost.jp/zipcode/dl/kogaki.html #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #define NAME "ken_all.csv" #define SIZE 1024 #define setstr(x,z) {strcpy(x,strtok(z,",\""));} struct tb{ //構造体設定 char dummy[SIZE]; //全国地方公共団体コード char old_num[SIZE]; //旧郵便番号 char now_num[SIZE]; //現在の郵便番号 char kana1[SIZE]; //都道府県名(カナ) char kana2[SIZE]; //市区町村名(カナ) char kana3[SIZE]; //町域名(カナ) char kanji1[SIZE]; //都道府県名(漢字) char kanji2[SIZE]; //市区町村名(漢字) char kanji3[SIZE]; //町域名(漢字) }; int main(int argc, char *argv[]) { struct tb line; FILE *fp; char *address, buff[SIZE], string_buff[SIZE]; int flag; clock_t start,end; start = clock(); if(argc == 1){ printf("引数を指定してください\n"); } if(argc > 2){ printf("引数が多すぎます、引数は1つにしてください。\n"); return -1; } if((fp=fopen(NAME,"r"))==NULL){ printf("ファイル%sが開けません\n",NAME); return -1; } flag=0; address = argv[1]; while(fgets(buff,SIZE,fp) != NULL){ //各項目の設定 strcpy(line.dummy,strtok(buff,",\"")); strcpy(line.old_num,strtok(NULL,",\"")); strcpy(line.now_num,strtok(NULL,",\"")); strcpy(line.kana1,strtok(NULL,",\"")); strcpy(line.kana2,strtok(NULL,",\"")); strcpy(line.kana3,strtok(NULL,",\"")); strcpy(line.kanji1,strtok(NULL,",\"")); strcpy(line.kanji2,strtok(NULL,",\"")); strcpy(line.kanji3,strtok(NULL,",\"")); //文字の連結 strcpy(string_buff,line.kanji1); strcat(string_buff,line.kanji2); strcat(string_buff,line.kanji3); //住所の比較 if(strcmp(string_buff,address)==0){ printf("〒%s \n",line.now_num); flag=1; break; } //郵便番号の比較 if(strcmp(line.now_num,address)==0){ printf("%s \n",string_buff); flag=1; break; } } fclose(fp); if(flag==0 && atoi(argv[1]) == 0){ printf("「%s」に該当する郵便番号はありませんでした\n",address); } if(flag==0 && atoi(argv[1]) != 0){ printf("「%s」に該当する住所はありませんでした\n",address); } end = clock(); printf("%.30f秒かかりました\n",(double)(end-start)/CLOCKS_PER_SEC); return 0; }

専門家に質問してみよう