ページ 11

C言語でCGIやってます。

Posted: 2010年11月04日(木) 21:54
by あま
簡単掲示板を作成しようとしているのですが
コンパイルがうまくいって実行するときになると
スクリプトエラーになってしまいます。

int main()
{
char *data;
FILE *fp;

printf("Content-type: text/html\n\n");
printf("<html><head><title>C-CGI 簡単掲示板</title></head>\n");
printf("<body>\n");
printf("<font color=\"red\">C-CGI 簡単掲示板\n");
printf("<hr>\n");

fp = fopen("./logs.cgi","r");
while(fgets(data,1024,fp) != NULL)
{
printf("%s",data);
}
fclose(fp);
}

まだ作成段階で今のところこんな感じで書いてるのですが。。。

fp = fopen("./logs.cgi","r");
while(fgets(data,1024,fp) != NULL)
{
printf("%s",data);
}
fclose(fp);
この部分を消すとちゃんと表示されますが
ファイル操作をするとスクリプトエラーになります。
どういうことでしょうか?

サーバーはXreaをレンタルして使用しています。

Re:C言語でCGIやってます。

Posted: 2010年11月04日(木) 21:56
by あま
それから追記なんですが、
HTML出力のところも毎回
printfを使うのめんどうなので
sprintf(buf,"Content-type: text/html\n\n"
"<html>\n"
"<head>・・・・・\n");
という感じで書いて
printf("%s",buf);
とやるのですが、これもスクリプトエラーになります。

Re:C言語でCGIやってます。

Posted: 2010年11月04日(木) 22:20
by Dixq (管理人)
まず、コンパイル環境はサーバー上ですか?
サーバー上ではない場合、サーバーのOSと同じ環境でコンパイルしていますか?

Re:C言語でCGIやってます。

Posted: 2010年11月04日(木) 22:24
by あま
>まず、コンパイル環境はサーバー上ですか?
はい。サーバー上でコンパイルしています。
Perlで
system("gcc ./bbs.c -o bbs.cgi");
とやってコンパイルしています。
パーミッションは755です。

Re:C言語でCGIやってます。

Posted: 2010年11月04日(木) 23:21
by Dixq (管理人)
なるほど、シェルを開かなくてもそうやればコンパイル出来るんですね^^;

ところで、ファイルポインタは使う前にNULLかどうかチェックするべきだと思います。

fp = fopen("./logs.cgi","r");

if( fp == NULL ){
printf("open failed\n");
return 0;
}

while(fgets(data,1024,fp) != NULL)

みたいな。
きっとNULLなんだと思いますが、どうなります?

Re:C言語でCGIやってます。

Posted: 2010年11月04日(木) 23:35
by ISLe
fgetsで読み込む前にdataが初期化されていないせいではないでしょうか?
No:64635のsprintfのバッファも同じ問題なのでは?

No:64635については文字列を並べると繋がるので
printf(
"Content-type: text/html\n\n"
"<html>\n"
"<head>・・・・・\n"
);
のようにするのはどうでしょう。

Re:C言語でCGIやってます。

Posted: 2010年11月04日(木) 23:41
by Dixq (管理人)
あ!
dataってただのポインタで領域確保してないですねorz

char data[1024];

にすると良いと思います。

Re:C言語でCGIやってます。

Posted: 2010年11月05日(金) 00:00
by あま
おお!!
ありがとうございます^^v
無事にできました。
領域確保しないとダメだったんですね>_<

data[1024];

とすることで解決でした。