文字列を取得して代入するには?

[上に] [前に] [次に]
アドル [E-Mail] 2000/02/19(土) 14:17:50
Cでcgiを書いているのですが、
呼び出した機能によって出力された文字列を、
変数に代入するにはどうしたらよいのでしょうか?
C言語もcgiも初心者なので、
どちらかで基本的な概念自体の勘違いをしてるかもしれませんが、
よろしくお願いします。
サーバーはUNIXで、
decoderというコマンドによって、
ある文字列が出力されるようになっています。
それを
char mozi[]={system("decoder")};
このように代入しようとしても代入されません。

S-pore [HomePage] 2000/02/20(日) 18:55:16
うーん,Perlなら
$mozi = `decoder`;
でいけるんでしょうけどねぇ・・・。
C言語にもこのバッククウォートと同じようなことができる関数があるんでしょうか・・・。
少なくとも, system() ではたぶん無理でしょう。これの戻り値は int なので。
一応,強引に(っていうかこれしか方法がないのかも)一時ファイルを作る方法でやってみると・・・

{
  FILE *fp;
  char str[256];

  system("decoder > tmp.txt");
  if ((fp = fopen("tmp.txt", "r")) == NULL)
    exit(1);
  fgets(str, 256, fp);
  fclose(fp);
    :
    :
}

これでたぶん str[] に decoder の実行結果が入ってくれると思いますが・・・。

Ichi 2000/02/21(月) 06:07:23
たしかにアドルさんはC言語の文字列について勘違いをなさっている様です。
C言語の文字列(に見えるもの)の実体は、メモリ上に確保されたchar型配列へのポインタです。
これは、初心者がつまづくところの一つです。(わかってしまえばなんてことはないのだが)
さらに言えば、system関数の戻り値は成功したら偽、失敗したら真です。

あとはS-poreさんの方法でいいと思います。

ラウォッチ 2000/02/21(月) 10:59:15
以下でやれば、一時ファイルは必要ありません。
{
  FILE *fp;
  char str[256];

  if ((fp = popen("decoder", "r")) == NULL)
    exit(1);
  fgets(str, 256, fp);
  pclose(fp);
    :
    :
}

アドル 2000/02/23(水) 11:46:12
[[解決]]
皆さんいろいろご指導ありがとうございます。
popenっていう関数があったんですね。
知りませんでした。
おかげさまで解決いたしました。

[上に] [前に] [次に]