掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.23818

ssystem関数でのファイルコピー実行
投稿者---blue(2005/10/25 01:53:26)


下のソースで、コピー先ファイル名をキーボードから入力して実行させたいのですが、system関数の中で変数と認識してくれません。
括弧をつけてみたりといろいろやっているのですが、そのままfilebと表示されるばかりです。
正しい書き方を教えていただけないでしょうか。
よろしくお願いします。

<pre>#include&lt;stdio.h&gt;
#include&lt;string.h&gt;
main()
{
  char filea[] = &quot;test&quot;;
  char fileb[128];
  printf(&quot;コピー先ファイル名=&gt;&quot;);
  scanf(&quot;%s&quot;,fileb);
char copy[] = &quot;cp&quot; filea fileb;
  system(copy);
}

</pre>




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ssystem関数でのファイルコピー実行 23820 Blue 2005/10/25 02:23:42
<子記事> Re:ssystem関数でのファイルコピー実行 23822 まきじ 2005/10/25 07:52:50
<子記事> Re:ssystem関数でのファイルコピー実行 23846 blue@質問者 2005/10/26 12:48:33
<子記事> Re:ssystem関数でのファイルコピー実行 23864 tetrapod 2005/10/27 09:48:36


No.23820

Re:ssystem関数でのファイルコピー実行
投稿者---Blue(2005/10/25 02:23:42)


引用符で囲われた文字列内の変数名は文字列のまま扱われます。
# PerlやPHPとはちがいます。

char str[] = "てすと";
char test[] = "str";

と書いても、testは"str"という文字列が格納されているとしか認識されません。

どうすれば、任意の変数を文字列に組み込めるかは
sprintf関数を調べてみてください。

それと、似たようなHNが同一掲示板のサイトにある場合はなるべく避けてもらいたいです。
# 一応私のほうがこのHNで昔からやっていますので。。。
# カナリ動揺してしまった。。。



この投稿にコメントする

削除パスワード

No.23821

Re:ssystem関数でのファイルコピー実行
投稿者---Blue(2005/10/25 02:29:00)


とおもったら、よく見てみてたら、
>char copy[] = "cp" filea fileb;
だったのね。

これってコンパイルとおるのか?
# VCでコンパイルしてみたら、案の定 C2146 がでました。

投稿する前に必ず確認しましょう。ssystem関数なんてないし、
ソースがメチャクチャになっているのが確認できると思います。
普通それを承知で、投稿しませんよね?



この投稿にコメントする

削除パスワード

No.23822

Re:ssystem関数でのファイルコピー実行
投稿者---まきじ(2005/10/25 07:52:50)


>下のソースで、コピー先ファイル名をキーボードから入力して実行させたいのですが、system関数の中で変数と認識してくれません。

strcat() という文字列の連結の標準関数でいかが?


この投稿にコメントする

削除パスワード

No.23846

Re:ssystem関数でのファイルコピー実行
投稿者---blue@質問者(2005/10/26 12:48:33)


Blueさん、まきじさん、レスありがとうございます。
Blueさん、同一ハンドルにならないよう、気をつけたいと思います、申し訳ありませんでした。

最初に貼り付けたソースはたしかに動きませんでした。
初めは意図しない動作で動いていたのですが、投稿する前に少し触ってしまったようです。
今回紹介していただいたsprintf関数を使うことでプログラムを作ることができました。
sprintf関数なんて便利なものがあったんですか。
他にもfgets関数を使用しています。
大変勉強になりました。
ありがとうございます。
最後に動作したソースを貼り付けます。

#include<stdio.h>
#include<string.h>
main()
{
  char filea[] = "test";
  char fileb[128];
  printf("コピー先ファイル名=>");
fgets(fileb,sizeof(fileb),stdin);
fileb[strlen(fileb)-1] = '0';
sprintf(copy,"cp %s %s",filea,fileb");
  system(copy);
}





この投稿にコメントする

削除パスワード

No.23847

Re:ssystem関数でのファイルコピー実行
投稿者---Blue(2005/10/26 13:10:44)


copyの変数宣言がありませんけど(´Д`;)
> sprintf(copy,"cp %s %s",filea,fileb");
最後の " は?

ちなみに、fgetsで取得した文字列から改行文字を削除する方法として、
strchrで'\n'を探して、'\0'に置き換える方法もあります。

char buf[ 128 ];
char* p;

fgets( buf, sizeof( buf ), stdin );
/* 改行文字の位置を取得 */
p = strchr( buf, '\n' );
/* 改行文字があったら */
if ( p != NULL )
{
    /* 改行文字を終端文字に変更する */
    *p = '\0';
}


それと、ファイル名に空白が含まれることを考慮して、

> sprintf(copy,"cp %s %s",filea,fileb");
sprintf( copy, "cp \"%s\" \"%s\"", filea, fileb );

としたほうがいいかも。



この投稿にコメントする

削除パスワード

No.23864

Re:ssystem関数でのファイルコピー実行
投稿者---tetrapod(2005/10/27 09:48:36)


system() で何かする、ってのはいわゆるセキュリティホールになりかねないので推奨しません。
仮に、誰か悪意有るユーザがいて
・alias cp rm ってやってたらどうする?
・PATH の通し方を変更していたら?
・cp って名前のプログラムを別に用意していたら?
とか考えると怖くてとても実用する気になりません。
どうしても system() が使いたいなら "/usr/bin/cp" とフルパス明示すべきです。

提示の例はバッファオーバーフロー攻撃を喰らうと乗っ取られてしまいます。

練習レベルならいいけど...



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧