前のページで受け取った文字列の入力を受け取ってそれを処理して表示させるプログラムなのですが、1つ問題があり、
130行目のstrcat_sで引数3のaを参照すると
ブラウザ上で動く際に
sample.cgiは動作を停止しました
となってしまいます。
例えばその引数3をwordtmp2にしたときなどは動作停止しません。
また、コマンドプロンプトでsample.exeを動かした時には何の問題もなく通るのですがcgiだと動作が停止する原因がわかりません。
ちなみにこのプログラム以外の.cgiは動いているため、サーバの設定が間違っているということはないと思います(ローカルホスト使用)。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#define MAXLEN 3000 //文字列の長さ
// フォームから入力された日本語をデコードするプログラム
// 参考:「C言語道場」
//http://vapour.s22.xrea.com/clangdojo/index.php?assosiative_array.c
int decode(char *inBuf );
//文字列を置換する。 buf の中の mae を ato にする。成功=1 失敗=0
//参考:「C言語:文字列をいじる」
//www.geocities.jp/debu0510/personal/c_moji.html
int strrep(char *buf, char *mae, char *ato);
int main (int argc, char **argv)
{
typedef struct{
char* base; //単語の原型
int id; //単語の・・
char *pos; //単語の品詞
char arg; //単語の引数の・・
}_token;
_token p;
char buf[256];
char input[MAXLEN];
char input2[MAXLEN];
char input3[MAXLEN];
int flag = 0; //同義語があるかどうかのフラグ
FILE *fp_input;
char wordtmp[512];
char wordtmp2[512];
unsigned int i, j;
unsigned int size=10;
char data[256]; //単語のデータを格納
FILE *fp2; //fp2は入力ファイル
errno_t error;
char* ctx;
char nokori[MAXLEN]; //残りの文章
char ch;
char q[MAXLEN];
char *a[MAXLEN];
/* 入力データの取得。デコードおよび切り離しも含める */
for (i = 0; (ch = getchar()) != EOF; i++) {
if (ch == '\r' || ch == '\n'){
i--;
break;
//q[i]=ch;
}
else
q[i] = ch;
//i--;
}
q[i+1] = '\0';
decode(q);
getstring(q, "string", input3);
//getstring(q, "st1", st1);
getstring(q, "nokori", nokori);
a[0]=strtok(input3, " ");
for(i=1;a[i-1]!=NULL;i++){
a[i] = strtok( NULL," ." );
if(a[i]==NULL)break;
//puts(a[i]);
}
/************ 処理 ***************/
/************ 処理***************/
/************ cgi出力スペース ***************/
printf("Content-type:text/html\n\n");
printf("<HTML><HEAD>\n");
printf("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\">\n");
printf("<TITLE>自然言語ツール</TITLE>\n");
printf("</HEAD>\n<BODY>\n");
printf("<FORM METHOD=\"POST\" ACTION=\"../../dgg/Debug/t0.cgi\">");
printf("<input type=hidden name=string value=%s>",input3); //入力文章
//printf("<input type=hidden name=nokori value=%s>",nokori); //残りの文章
//printf("%s",nokori);
for(i = 0; i < size; ++i){
while(fgets(data, sizeof(data), fp2) != NULL){
p.base = strstr(data, "base");
if(p.base==NULL)break;
p.base = strtok_s((p.base)+6, "\"", &ctx);
strcat(p.base, " ");
// printf("原型は%sです、", p.base);
p.pos = strstr(data, "pos");
p.pos = strtok_s((p.pos)+5, "\"", &ctx);
// printf("品詞は%sだ\n", p.pos);
// }
//}
//fclose(fp2);
for(j=0;j<MAXLEN;j++) input[j] = NULL;
//指示語があれば対応する語句、語句の番号を格納する
if((strncmp(p.pos, "PRP", 3) == 0) ){
flag = 1;
sprintf(wordtmp, "%s", p.base);
sprintf(wordtmp2, " [[[%s]]] ", p.base);
strcat(input, wordtmp);
strcat(input2, wordtmp2);
}
else{
//sprintf(wordtmp, "%s", p.pos);
sprintf(wordtmp2, "%s", p.base);
//strcat(input, wordtmp);
if(a[i]!=NULL){
strcat_s(input2, sizeof(input2), a[i]);
strcat(input2, " ");
};
}
/* }*/
}
}
printf("<font size = 5>特定結果</font><br><br>\n");
//printf("%s", input);
printf("<hr><br>\n");
if(flag == 1){
printf("<textarea name=string rows=4 cols=50>%s</textarea><br><br>\n", input2);
printf("<input type=hidden name=string value=%s>",input2); //次に使う文章
printf("<hr><tt><font size = 5, color=red>%s</font></tt><br>\n", input);
printf ("<hr><tt>書き換えが終わったら、下の「次へ」ボタンを押してください。</tt><br>\n");
}
else{
printf("<input type=hidden name=string value=%s>",input3); //次に使う文章
}
printf ("<INPUT TYPE=SUBMIT VALUE=\"次へ\" >");
printf("</FORM></BODY></HTML>\n");
/*********************************************************/
fclose(fp2);
return 0;
}
/* フォームから入力された日本語をデコードするプログラム *
* 参考:「C言語道場」 */
int decode(char *inBuf ) {
int i;
int j;
int n = strlen(inBuf);
char decodeBuf[3];
char c[MAXLEN];
char outBuf[MAXLEN];
j=0;
for ( i=0; i<n; i++) {
if (inBuf[i] == '%' ) {
strncpy(decodeBuf, &inBuf[i+1], 2);
decodeBuf[2] = 0x00;
sscanf(decodeBuf, "%2x", &c);
outBuf[ j++ ] = c[MAXLEN];
i += 2;
}
else
outBuf[j++] = inBuf[i];
}
outBuf[j] = 0x00;
strcpy(inBuf, outBuf);
return 0;
}
/* フォームからの入力を切り離すプログラム *
* 参考:「猫でも分かるプログラミング」 */
int getstring(char *src, char *element, char *dest)
{
int len;
char *data, *amp;
char *temp;
len = (int)strlen(src) + 1;
temp = (char *)malloc(len);
if (len >= MAXLEN) {
free(temp);
return -1;
}
strcpy(temp, src);
data = strstr(temp, element);
if(data == NULL) {
strcpy(dest, "no element");
free(temp);
return -2;
}
len = (int)strlen(element) + 1;
amp = strstr(data, "&");
if (amp == NULL) {
strcpy(dest, data + len);
if (dest[0] == '\0') {
strcpy(dest, "no data");
free(temp);
return 0;
}
free(temp);
return 1;
}
data[(int)(amp-data)] = '\0';
strcpy(dest, data + len);
if (dest[0] == '\0') {
strcpy(dest, "no data");
free(temp);
return 0;
}
free(temp);
return 0;
}
//文字列を置換する。 buf の中の mae を ato にする。成功=1 失敗=0
//参考:「C言語:文字列をいじる」
int strrep(char *buf, char *mae, char *ato)
{
char *mituke;
size_t maelen, atolen;
maelen = strlen(mae);
atolen = strlen(ato);
if (maelen == 0 || (mituke = strstr(buf, mae)) == NULL) return 0;
memmove(mituke + atolen, mituke + maelen, strlen(buf) - (mituke + maelen - buf ) + 1);
memcpy(mituke, ato, atolen);
return 1;
}