(C言語)フォームから受け取った値をクッキーで発行するにはどのようにするのでしょうか?
問題として
・フォームから値を受け取る事は出来てもクッキーが発行できない
もしくは
・フォームから値を受け取れないのにクッキーは発行できる
のどっちかしか出来ないため困りました。
どうすればフォームから受け取った値をクッキーで発行できますか?
---以下ソース---
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int Deta1(char *a,int b,char *nameset[],char *valueset[]);
int Dcd(char *set,int a);
int get_cookie(char *a,int b,char *nameset2[],char *valueset2[]);
void set_cookie(char *valueset[]);
void main(void){
int i;
int a=0;
char *chr=NULL;
char *nameset[7];
char *valueset[7];
char *nameset2[7],*valueset2[7];
int b=200;
int mode=0;
char *ss=getenv("HTTP_COOKIE");
for(i=0;i<7;i++){
nameset2[i]=NULL;
valueset2[i]=NULL;
}
printf("content-type: text/html\n");
//set_cookie(valueset); //ここでset_cookie関数を呼び出せばクッキーは発行出来るけれどフォームに入力された値が入らない
printf("\n");
if(mode==0){
//省略しますがフォームで7つの項目があると思ってくださいね
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 ;
}
printf("%s<br>",chr);
int deta1=Deta1(chr,a,nameset,valueset);
for(int i = 0;i<deta1;i++){
Dcd(nameset[i],strlen(nameset[i]));
Dcd(valueset[i],strlen(valueset[i]));
}
for(i=0;i<7;i++){
printf("%s %s<br>",nameset[i],valueset[i]);
}
//set_cookie(valueset); //ここでset_cookie関数を呼び出せばフォームが入力された値が入るけれどクッキーは発行できない
int deta2=get_cookie(ss,b,nameset2,valueset2);
for(i=0;i<7;i++){
printf("%s %s<br>\n",nameset2[i],valueset2[i]);
}
free((void *)chr);
}
else if(mode==1){
//省略
}
else{
//省略
}
}
int Deta1(char *a,int b,char *nameset[],char *valueset[]){
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;
}
int get_cookie(char *a,int b,char *nameset2[],char *valueset2[]){
int i=0,cn=0;
if(a==NULL){
return(-1);
}
while((a[++i]!=NULL)&&(i<b)){
if(a[i]=='='){
a[i]=NULL;
nameset2[0]=a+i+1;
}
if(a[i]=='-'){
a[i]=NULL;
valueset2[cn]=a+i+1;
}
else if(a[i]=='&'){
a[i]=NULL;
cn++;
nameset2[cn]=a+i+1;
}
}
return cn+1;
}
void set_cookie(char *valueset[]){
time_t timer;
struct tm *tset;
char expires[256];
char *name="sskchat";
int kikan=86400*90;
char *set[7];
int i;
for(i=0;i<7;i++){
set[i]=valueset[i];
}
for(i=0;i<7;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=mode-%s&name-%s&mail-%s&hp-%s&cc-%s&gyo-%s&zkou-%s; expires=%s;\n",name,set[0],set[1],set[2],set[3],set[4],set[5],set[6],expires);
}
---ソースここまで---
No.2ベストアンサー
- 回答日時:
> 最初に初期値を入れればいいのですか?
いいえ、何を作ろうとしているのか思い出してください。
クッキーに入れたいのは「フォームから受信した値」のはずです。
フォームからGETなりPOSTなりのメソッドで送られたデータを受信後に必要なものだけを取り出しクッキーに格納してから画面表示するのが目的(質問もそうなってませんか?)かと思いますが・・・。
最初に初期値を入れてもいれなくてもどうでもいいのですが、クッキーにセットする前に目的のデータを用意して代入しないと勝手に入ってはくれません。 最初のクッキーセットはデータ取得の前に行っていますよ。
蛇足ですが、初期値はどうでもいいと書きましたが、
Cの場合は宣言だけではメモリ上に実体が確保されるわけではないので、初期値をしっかり入れて実メモリ領域を確保しとくのは予期しないバグを生み出さないための常套手段だと思います。
> 確かにごちゃごちゃしてると言われればそんな気もします
> うまくまとめているような参考例でもなければなかなかまとめ方がよく分からんのです
ちゃんと動いて自身で全体を把握できてなおかつ人に見せるものでなければごちゃごちゃしていようといっこうにかまわないと思います。
参考例は書籍やその言語の解説サイトをみれば、人に見せるためのものがほとんどなので、ちゃんと整理されたサンプルになっているかと。
> 出力部と処理の部で分けたらまたごちゃごちゃしそうだと思いますしね
うーん・・・。ごちゃごちゃさせないために機能を分類整理するんだと思いますが・・・。
この回答への補足
>>最初に初期値を入れてもいれなくてもどうでもいいのですが、クッキーにセットする前に目的のデータを用意して代入しないと勝手に入ってはくれません。 最初のクッキーセットはデータ取得の前に行っていますよ。
これができればできそうですがやり方がわかっていないないのでしょうね
質問内容を変えて参考になりそうなサイトを聞いてみますね
(グーグルで調べてもじぶんではなかなかみつけられなかったため)
>>うーん・・・。ごちゃごちゃさせないために機能を分類整理するんだと思いますが・・・。
おかしいですね
機能を分類すればするほどよりごちゃごちゃしていってしまいます
No.1
- 回答日時:
流れを見てゆくと最初のsetcookieのパラメータvaluesetには値が代入されていないのでcookieが入らないのはそのためです。
全体的に、処理じたいがごちゃごちゃしてるので「処理部」と「出力部」に整理しましょう。デバッグ用のトラップならともかく処理しながら出力していたらどこに問題があるのかわかりにくくなります。
そして、出力はご存知かと思いますが、「httpヘッダ部」と「コンテンツ部」に分離して出力します。
概念:
printf(httpヘッダ\n\n);
printf(コンテンツ);
当然cookieはhttpヘッダ部内で指定します。
ヘッダ出力が終わるまで2連改行コードを出してはいけません。\n\nはヘッダの終了を意味し、残りのテキストはコンテンツと判断されます。
コンテンツはplainテキストで出力されているようですが、モダンブラウザならあまり問題はないでしょう(httpヘッダではhtml指定されているので・・・)。
この回答への補足
<<最初のsetcookieのパラメータvaluesetには値が代入されていないのでcookieが入らないのはそのためです。
最初に初期値を入れればいいのですか?
確かにごちゃごちゃしてると言われればそんな気もします
うまくまとめているような参考例でもなければなかなかまとめ方がよく分からんのです
出力部と処理の部で分けたらまたごちゃごちゃしそうだと思いますしね
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
配列をnビットシフトする
-
CStringをwchar_tに変換したい
-
double型の値をchar配列に変換...
-
コンパイルエラー invalid ope...
-
variant型ってどのような仕組み...
-
strchr() の第2引数はなぜ int ...
-
C++ の FileCopy の設定が解り...
-
int main()の・・・
-
_TCHAR*での引数の読み込み
-
c++ 文字列を入力して、一文字...
-
-'0'の意味について
-
コマンドラインに入力されてい...
-
数字文字の出現回数を表示する...
-
文字列がNULLか空文字列かの判定
-
new
-
sprintfに同じ変数は使えるか
-
間接参照のレベルが異なっています
-
charからLPTSTRへの変換方法
-
c言語
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
charでの計算?
-
C言語のfor文です。 繰り返しの...
-
charからLPTSTRへの変換方法
-
文字列から空白を取り除きたい...
-
C言語の入力した文字を反転させ...
-
'const char *' 型は 'char *' ...
-
配列をnビットシフトする
-
str系関数を使わずに二つの文字...
-
int main()の・・・
-
atoi( ) の反対をやりたい
-
CStringをwchar_tに変換したい
-
c++ 文字列を入力して、一文字...
-
switch文で文字を比較すること...
-
干支のプログラム
-
3桁区切(コンマ)記号をつけ...
-
絶対パスからのファイル名の切...
-
間接操作のレベルとは
-
間接参照のレベルが異なっています
-
型変換
おすすめ情報