C フォームから受け取った知をクッキーで発行 2
前回 http://okwave.jp/qa/q7765400.html
からあれこれしてフォームの値をクッキーに保存できるようになったのですが、バグが出てきました。
一、クッキーが存在しないとエラーが出る
ニ、Deta1関数を使って文字列の分解を試みるもうまく分解されない
この2つのバグを解決するにはどうしたら直せますか?
---以下ソース---
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
char *nameset[2],*valueset[2];
char *nameset2[2],*valueset2[2];
int Deta1(char *a,int b);
int Dcd(char *set,int a);
void get_Form(void);
void get_cookie(void);
void set_cookie(void);
int hen(char *buf, char *mae, char *ato);
void Page(int mode);
int main(void) {
char *nameset[2],*valueset[2];
char *nameset2[2],*valueset2[2];
printf("Content-type: text/html\n");
get_Form();
set_cookie();
get_cookie();
printf("\n");
Page(0);
}
int Deta1(char *a,int b){
int i=0,cn=0;
if(a[0]==NULL){
return(-1);
}
nameset[0]=a;
while((a[++i]!=NULL)&&(i<b)){
/* 項目の分解 */
if(a[i]=='='){
a[i]=NULL;
valueset[cn]=a+i+1;
}
/* データ項目で分解 */
else if(a[i]=='&'){
a[i]=NULL;
cn++;
nameset[cn]=a+i+1;
}
}
return cn+1;
}
int Dcd(char *set,int a){
int i,j;
char buf,*tmp;
if(a==0){
return -1;
}
tmp=(char*)malloc(a);
for(i=0,j=0;i<a;i++,j++){
if(set[i]=='+'){tmp[j]=' ';continue;}
if(set[i]!='%'){tmp[j]=set[i];continue;}
if(set[++i]>='A'){buf=set[i]-'A'+10;}
else{buf=set[i]-'0';}
buf*=16;
if(set[++i]>='A'){buf+=set[i]-'A'+10;}
else{buf+=set[i]-'0';}
tmp[j]=buf;
}
for(i=0;i<j;i++){
set[i]=tmp[i];
}
set[i]='\0';
free(tmp);
return 0;
}
void get_Form(void){
int a=0;
int i=0;
char *chr=NULL;
if ( getenv("CONTENT_LENGTH")!=NULL ){
a = atoi( getenv("CONTENT_LENGTH") );
}
chr=(char *)malloc(a+1);
scanf("%s",chr);
chr[a] = '\0';
if (a==0){
return ;
}
int deta1=Deta1(chr,a);
}
void get_cookie(void){
int i=0,cn=0;
int a=NULL;
char *b;
if( (getenv("HTTP_COOKIE"))!=NULL){
a=strlen(getenv("HTTP_COOKIE"));
}
if(a==NULL){
}
b=getenv("HTTP_COOKIE");
while((b[++i]!=NULL)&&(i<a)){
if(b[i]=='='){
b[i]=NULL;
nameset2[0]=b+i+1;
}
/* 項目の分解*/
if(b[i]=='-'){
b[i]=NULL;
valueset2[cn]=b+i+1;
}
/*データ項目で分解*/
else if(b[i]=='&'){
b[i]=NULL;
cn++;
nameset2[cn]=b+i+1;
}
}
for(i=0;i<cn+1;i++){
Dcd(nameset2[i],strlen(nameset2[i]));
Dcd(valueset2[i],strlen(valueset2[i]));
}
}
void set_cookie(void) {
time_t timer;
struct tm *tset;
char expires[256];
char *name="sskchat";
int kikan=86400*90;
char *set[2];
int i;
for(i=0;i<2;i++){
set[i]=NULL;
}
for(i=0;i<2;i++){
set[i]=valueset[i];
}
for(i=0;i<2;i++){
if(set[i]==NULL){
set[i]="no";
}
}
timer = time(NULL);
timer += kikan;
tset = gmtime(&timer);
strftime(expires, 255, "%a, %d-%b-%Y %H:%M:%S GMT", tset);
printf("Set-Cookie:%s=name-%s&mail-%s; expires=%s;\n",name,set[0],set[1],expires);
}
void Page(int mode){
FILE *fp;
char *f1="!name!",*h1;
char *f2="!mail!",*h2;
if(valueset2[0]==NULL||strcmp("!name!",valueset2[0])==0){
h1="";
}
else{
h1=valueset2[0];
}
if(valueset2[1]==NULL||strcmp("!mail!",valueset2[1])==0){
h2="";
}
else{
h2=valueset2[1];
}
char buf[200];
char set[200];
fp = fopen("ren.html", "r+");
while( fgets( set, 200, fp ) != NULL ){
strcpy(buf,set);
while(hen(buf, f1, h1));
while(hen(buf, f2, h2));
printf("%s", buf);
}
fclose(fp);
}
int hen(char *buf, char *mae, char *ato){
char *nw;
size_t zen,go;
zen = strlen(mae);
go = strlen(ato);
if(zen == 0 || (nw = strstr(buf, mae)) == NULL){
return 0;
}
memmove(nw + go, nw + zen, strlen(buf) - (nw + zen - buf ) + 1);
memcpy(nw, ato, go);
return 1;
}
---ソースここまで---
---ren.htmlの内容---
<form action="first.exe" method="post">
名前:<input type="text" name="name" size="100" value="!name!"><br><br>
メール:<input type="text" name="mail" size="100" value="!mail!"><br><br>
本文:<textarea name="text" cols="70" rows="10"></textarea><br><br>
<input type="submit" value=" 送 信 "><br>
</form>
お礼
ありがとうございます!! 指摘にしたがって改良したらパイプ実装できました! プログラム全体の見やすさ等は現在の課題でもあります。 ご指摘ありがとうございます。 今後も精進していきます