3

このコードがあります。に引数を直接書き込むsystem()と機能し、引数を渡すと機能しません。何か助けてください。

char dest[100];
char file[50];
char dir[100];

printf("Enter source path: ");
scanf("%s", dir);

printf("Enter filename: ");
scanf("%s", file);

printf("Enter destination path: ");
scanf("%s", dest);

system("move \"c:\\users\\putty.exe\" g:\\ \n" );  /* <--works        */
system("move \"%s%s\" %s", dir,file,dest);         /* <--doesn't work */
4

2 に答える 2

5

これを試すことができます

char dest[100];
char file[50];
char dir[100];
char command[300];
printf("Enter source path: ");
scanf("%s", dir);
printf("Enter filename: ");
scanf("%s", file);
printf("Enter destination path: ");
scanf("%s", dest);
sprintf(command,"move %s%s %s", dir,file,dest);  
system(command); 
于 2013-01-23T04:26:00.973 に答える
3

system()コマンドはsnprintf()代替ではありません。を使用する必要がありsnprintf()ますsystem()

char command[1024];
...
snprintf(command, sizeof(command), "move \"%s%s\" %s", dir, file, dest);
system(command);

または、Windows を使用している場合は、snprintf_s()代わりにsnprintf(). ユーザーが値の最後にバックスラッシュを残さない場合dir、ディレクトリとファイル名の最後のコンポーネントが結合されることにも注意してください。おそらく使用する必要があります:

snprintf(command, sizeof(command), "move \"%s\\%s\" %s", dir, file, dest);

Windows カーネルはパス名にスラッシュを使用することに非常に満足していますが、コマンド プロセッサはそれほど満足していません。オペレーティング システムを直接呼び出すのではなく、コマンド プロセッサを呼び出してプログラムを実行するため、バックスラッシュを使用する必要があると思います。

system()コンパイラは、正しく呼び出していないことを通知しているはずであることに注意してください。ヘッダーは<stdlib.h>、関数が引数を 1 つだけ取ることを示しています。

ISO/IEC 9899:2011 §7.22.4.8system関数

あらすじ

¶1#include <stdlib.h>

int system(const char *string);

説明

¶2 string が null ポインタの場合、system関数はホスト環境にコマンド プロセッサがあるかどうかを判断します。string が NULL ポインタでない場合、system 関数は が指す文字列stringをそのコマンド プロセッサに渡し、実装で文書化される方法で実行されます。これにより、プログラム呼び出しsystemが非準拠の方法で動作したり、終了したりする可能性があります。

system()コンパイラが2 番目の呼び出しで誤用していることを知らせていない場合、またはsystem()使用前に宣言されていたことに文句を言っていない場合は、コンパイルの警告レベルを上げるか、より優れたコンパイラを入手する必要があります。警告されていた場合は、その内容に注意を払う必要があります。コンパイラは、あなたよりも C についてよく知っていることを忘れないでください。

于 2013-01-23T04:23:29.383 に答える