文字列を分割して変数に格納する方法

このQ&Aのポイント
  • 文字列を分割して変数に格納する方法について詳しく教えてください。
  • ソースコードの説明として、文字列を分割して変数に格納する方法について説明します。
  • ソースコードの最後に結果を表示する部分がありますが、正しく変数に格納されない原因がわかりません。
回答を見る
  • ベストアンサー

文字列を分割して変数に格納したい

文字列を分割して変数に格納したいのですがうまくいきません。 ---以下ソース--- #include <stdio.h> #include <string.h> void main(void){ char tai[]="name1=value1&name2=value2&name3=value3&name4=value4"; char *tp; int a; int b; int i; int co=0; a=strlen(tai); for(i=0;i<a;i++){ if(tai[i] == '='){ co++; } } b=co; char *nameset[b]; char *valueset[b]; *nameset[0]=*strtok( tai,"&=" ); i=1; co=0; while ( tp != NULL ) { if(0==i%2){ co=i/2; *nameset[co] = *strtok( NULL,"&=" ); } else{ co=i/2; *valueset[co] = *strtok( NULL,"&=" );} i++; } for(i=0;i<b;i++){ printf("%s : %s\n",nameset[i],valueset[i] ) } } ---ソースここまで--- どうしたらちゃんと変数に格納されますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.6

ちゃんと動くかどうかは、わかりません。 #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char str[] = "name1=value1&name2=value2&name3=value3&name4=value4"; char **name, **value, *tp, *dlm = "=&"; int n, i; for (n = i = 0; str[i]; i++) { if (str[i] == '=') { n++; } } name = (char **) malloc(sizeof(char *) * n); value = (char **) malloc(sizeof(char *) * n); if (!name || !value) { exit(0); } tp = strtok(str, dlm); for (i = 0; tp && i < n; i++) { if (tp) { name[i] = tp; tp = strtok(NULL, dlm); if (tp) { value[i] = tp; tp = strtok(NULL, dlm); } } } for (i = 0; i < n; i++) { printf("name =%s\n", name[i]); printf("value=%s\n", value[i]); } free(name), free(value); return 0; }

nanaka2222
質問者

補足

あの後自分なりに皆さんの指摘を参考にソースを再構築してみました whoilがなくなったので固定数になりましたが 6さんの教えていただいたソースも参考にしますね ありがとうございました。 #include <stdio.h> #include <string.h> void main(void){ char tai[]="name1=value1&name2=value2&name3=value3&name4=value4"; char *nameset[4]; char *valueset[4]; int i; nameset[0]=strtok( tai,"&=" ); for(i=1;i<8;i++){ if(i%2==0){ nameset[i/2]=strtok( NULL,"&=" ); } else{ valueset[i/2]=strtok( NULL,"&=" ); } } for(i=0;i<4;i++){ printf("%s %s\n",nameset[i],valueset[i]); } }

その他の回答 (7)

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.8

>「名前=値」のリストが & で連結されているので, 最初の forループ内では '=' とではなく '&' と比較するのが筋だと思います>#6. まあ、それは考え方のちょっとした違いでしかなくて、 どっちでもいいかな、と思います。

nanaka2222
質問者

補足

私自身もどちらも同じだと思うのですが=で判定せよ っと説明を受けたので=で判定するようにしました

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.7

他の回答者への突っ込み+補足のみ. 「名前=値」のリストが & で連結されているので, 最初の forループ内では '=' とではなく '&' と比較するのが筋だと思います>#6. いや, 結局同じなんだけどさ. あと, char *nameset[b]; char *valueset[b]; などは C99 (以降) なら OK です>#2. C++ では 11 でも NG ですが, C++ なら std::vector でもつかっとけということで.

nanaka2222
質問者

補足

<<「名前=値」のリストが & で連結されているので, 最初の forループ内では '=' とではなく '&' と比較するのが筋だと思います>#6. いや, 結局同じなんだけどさ. 私自身もどちらも同じだと思うのですが=で判定せよ っと説明を受けたので=で判定するようにしました <<あと, char *nameset[b]; char *valueset[b]; ここら辺を修正する事にします

  • hashioogi
  • ベストアンサー率25% (102/404)
回答No.5

#3です。 ●2 *nameset[0]=*strtok( tai,"&=" ); Q。つまり指定先が間違っているのですね A。代入先も間違っているし代入元も間違っています。多分。 ●3 tpの初期化は必要はないのです。tpにstrtokで分割した文字列が入っていれば問題はないと思います どこでtpに文字列を入れる文がありますか ? 見当たりませんが。 また、初期化しなくてよい理由はありません。私にはtpに何が入っているかわからないで while(tp !=NULL) を実行する意味が理解できません。たまたまtpがNULLならwhile内は実行されますが、そうでなければ実行されないという博打のようなプログラムですよ。

nanaka2222
質問者

補足

ああすみません。 よく見たら非常におかしな事を書いていました 修正をなんどもっしているうちにへんなことになってたみたいです 申し訳ありませんでした。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.4

そもそも、どういう結果になることをお望みなんでしょうか。

nanaka2222
質問者

補足

strtokを使ってtai[]を分割した文字列を setneme[]={"name1,"name2","name3"}; setvalue[]={"value1","valu2","value3"}; のように格納したいのです。

  • hashioogi
  • ベストアンサー率25% (102/404)
回答No.3

完成までは大分道が遠そうだと感じました。 いくつか指摘するだけにしておきたいと思います。 (1) 途中で以下の定義が現れます。 char *nameset[b]; char *valueset[b]; 私のコンパイラでは翻訳エラーが出ます。質問者のコンパイラではエラーが出ないものとして話を続けます。 (2) 次の行では *nameset[0]=*strtok( tai,"&=" ); が現れます。 strtokは検索した文字列の検索結果のポインタを返します。でも*をつけるとそこが指している実体になります。格納先のnameset [0]はポインタを格納する領域を配列としてb個分用意したものですが、まだそこには何が書かれているかわかりません。その何が格納されているかわからない内容をアドレスとして代入したら、往生しまっせ。 (3) 後ろの方に while ( tp != NULL ) { という文がありますが、tpは初期化もされていないし、だれも更新しないようですね。それでOKですか?

nanaka2222
質問者

補足

●1 その部分はいろいろ修正してみる事にします ●2 つまり指定先が間違っているのですね ●3 初期化は必要はないのです tpにstrtokで分割した文字列が入っていれば問題はないと思います

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

いろいろツッコミどころが…… >while ( tp != NULL ) { tpの値は不定値のまま更新されていません。 よって、ほぼ確実に無限ループします。 >*nameset[0]=*strtok( tai,"&=" ); nameset[0]が指すアドレス(不定値)に…strtok()の戻り値のアドレスに格納されている1文字をコピー…って事になるんですかね。 どこに書き込むかは不明ですので最近のOSならアクセス違反などの例外になるかと思われます。 >char *nameset[b]; >char *valueset[b]; C99で可能…なんでしたっけ? VC++2010EEでは「error C2057: 定数式が必要です。」となります。 正しく動作する…と思われる修正を行ったとして… nameset[]とvalueset[]に入るアドレスはstrtok()によって書き換えられたtai[]になります。 よって…tai[]の寿命に影響される点にはご注意を。

nanaka2222
質問者

補足

<<tpの値は不定値のまま更新されていません。 よって、ほぼ確実に無限ループします。 事前に部分的につくりはしたのですがそのときは無限ループはしなかったようです。 <<nameset[0]が指すアドレス(不定値)に…strtok()の戻り値のアドレスに格納されている1文字をコピー…って事になるんですかね。 どこに書き込むかは不明ですので最近のOSならアクセス違反などの例外になるかと思われます。 一文字コピーになるのですか¥0で区切られた文字が入るのかと思いました。 >char *nameset[b]; >char *valueset[b]; 無理なのですね すみません他の方法を考えてみますね <<正しく動作する…と思われる修正を行ったとして… nameset[]とvalueset[]に入るアドレスはstrtok()によって書き換えられたtai[]になります。 よって…tai[]の寿命に影響される点にはご注意を。 注意しますごしてきありがとうございました

回答No.1

分割した後の文字列を格納するための領域を確保している部分が見当たらないし、初期化していないポインタを使用している部分も散見されるので、ちゃんと勉強しなおしたほうがいいですよ。

nanaka2222
質問者

補足

私が勉強不足なのは理解しています そのため実践を通してプログラムを組もうとしているのです

関連するQ&A

  • 文字列を分解して特定の項目を別の変数に

    文字列を分解して特定の項目を別の変数に入れたいのですが、条件式を満たさないので別の変数に入れれません 下にソースを書くのですが age の項目だけ別の変数に入れたいのです どのようにすれば入れれますか? #include <stdio.h> #include <string.h> char *nameset[12],*valueset[12]; char *nameset3[12],*valueset3[12]; void main(void){ int c=0; int i=0,cn=0,dn=0; char *tm=NULL; char *han; char *a="name=miku&age=15&like=momo"; int b=strlen(a); nameset[0]=a; while((a[++i]!=NULL)&&(i<b)){ /* 項目の分解 */ if(a[i]=='='){ a[i]=NULL; if(c!=1){ valueset[cn]=a+i+1; cn++; } else{ valueset3[dn]=a+i+1; dn++; c=0; } } /* データ項目で分解 */ else if(a[i]=='&'){ a[i]=NULL; han=a+i+1; if(strcmp(han,"age")==0){ nameset3[dn]=han; c=1; } else{ nameset[cn]=han; } } } printf("%s\n", nameset[0]); printf("%s\n", valueset[0]); printf("%s\n", nameset[1]); printf("%s\n", valueset[1]); printf("%s\n", nameset[2]); printf("%s\n\n", valueset[2]); printf("%s\n", nameset3[0]); printf("%s\n", valueset3[0]); }

  • C言語でファイルの内容を strtok関数 を使って数字と文字を分けて

    C言語でファイルの内容を strtok関数 を使って数字と文字を分けて配列に格納したいのですが、うまくできません。 どこが駄目なのかご指摘をお願いします! ファイル内容 20 田中 10 鈴木 #include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc,char *argv[]) { FILE *fp; char str[256]; char *tp; int i=0; int num[10]; char na[10]; fp=fopen(argv[1],"r"); while(fgets(str,sizeof str,fp)!=NULL); tp = strtok ( str, " " ); while(tp != NULL ) { num[i]=atoi(tp); tp = strtok( NULL," "); if ( tp != NULL ){ na[i]=*tp; } i++; } printf("%d\n%s",num[0],na[0]); printf("%d\n%s",num[1],na[1]); fclose(fp); return 0; }

  • ファイルの入出力に関する質問

    CSVファイルを読み込んで、処理をするプログラムを書いています。 しかし、うまくいきません。 CSVファイルは 単語1,数値データ 単語2,数値データ のようになっており、 これをsの配列に格納したいと思っています。 プログラムは以下の通りなんですが。。。 strtokはhttp://www9.plala.or.jp/sgwr-t/lib/strtok.html を参考にしました。 どなたかおしえていただけないでしょうか? #include<stdio.h> #include <string.h> int main(void) { FILE *fp; char s[1000][1000]; char tp[256]; int i=0; if((fp=fopen("in.csv","r"))==NULL){ printf("ファイルオープンできませんよ\n"); exit(1); } while(fgets(tp,256,fp)!=NULL){ tp=strtok(fp,","); puts(s[i][0]=tp); while (tp != NULL ) { tp = strtok(NULL,","); if (tp= NULL ){ puts(s[i][1]=tp); }}i++; } return(0); }

  • 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>

    • ベストアンサー
    • CGI
  • C言語 strtok

    失礼します。現在こちらでアドバイスを頂きfgetcを使用して配列に格納をすることができたのですが、CSVをカンマ区切りで格納したいのですが上手くいかず困っています。strtokを使用方法をドキュメントを読んでもうまく区切ったものを配列に入れる方法がわかりません 何卒よろしくお願いします。 ソースコード #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include<string.h> #define MAXITEM 1400 int split(char *str, const char *delim, char *outlist[]) { char *tk; int cnt = 0; tk = strtok(str, delim); while (tk != NULL && cnt < MAXITEM) { outlist[cnt++] = tk; tk = strtok(NULL, delim); } return cnt; } int main(void) { FILE *fp; char *fname = "testfile.csv"; char *tp; char *array[1400]; char *test[11][1400]; char c; int i = 0; int n,y; char *tp[1400]; fp = fopen(fname, "r"); if (fp == NULL) { printf("%sファイルが開けません¥n", fname); return -1; } while ((c = fgetc(fp)) != EOF) { array[i] = (char)c; i++; } tp = strtok(array, ","); puts(*tp); while (tp != NULL) { tp = strtok(NULL, ","); if (tp != NULL)puts(tp); } for (n = 0; n < 11; n++) { for (y = 0; y < 1400; y++) { test[n][y] = tp[y]; printf("%c", test[n][y]); } } fclose(fp); return 0; }

  • C言語で、ファイルを読み込んで数字と名前に分けて配列に格納に関する質問

    C言語で、ファイルを読み込んで数字と名前に分けて配列に格納に関する質問です! ファイルを開いた後でエラーとなるのですが、何が足りないのでしょうか? ファイル内容 20 田中 10 鈴木 #include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc,char *argv[]) { FILE *fp; char str[256]; char *tp; int k,i=0; int num[10]; char na[10][20]; fp=fopen(argv[1],"r"); if(fp==NULL){ printf("ファイルを開けません\n"); return 1; }else{ printf("開けた\n"); } while(fgets(str,sizeof str,fp)!=NULL){ tp=strtok(str," "); num[i]=atoi(tp); tp=strtok(NULL," "); strcpy(na[i],tp); i++; } printf("%d\n%s\n",num[0],na[0]); printf("%d\n%s\n",num[1],na[1]); fclose(fp); return 0; }

  • CSVファイルの内容を構造体に格納したい(Unix使用)。

    こんにちは。私は30代の男性です。 「名前」「身長」「体重」が記載されたCSVファイルの内容を読み取って、構造体の「name」「height」「weight」に格納するプログラムを作っています。CSVの内容は A,175,80 B,167,89 C,155,45 ・ ・ ・ Z,188,70 だと仮定します。数値が読み取れているか、下記のように「tp = strtok(file_image, ",\n" );」の前後に「printf("%s\n", file_image);」を置いてみたら、strtok前では全て表示されるのに、strtok後では「ABC」しか表示されません。これでは全てのデータを構造体に格納できないので、困っています。 1.どのようにすれば、数字も取り出せる(読み取れる)でしょうか? 2.効率よく構造体に格納するには、どのようにしたらよいでしょうか? アドバイスを頂ければ幸いです。宜しくお願いいたします。 #include <stdio.h> #include <stdlib.h> #include <limits.h> #include <string.h> int main(int argc, char *argv[]) { FILE *fp = NULL; int rtn = 0; if ((fp = fopen(argv[1], "r")) == NULL) { printf("ファイルオープンに失敗しました。\n"); return 1; } if (argc != 2) { printf("ERROR: オプションの数に過不足があります。\n"); return 1; } rtn = change_csv(fp); return 0; } int change_csv(FILE *fp) { int i; int j; char file_image[256]; /* 読み込んだ先のメモリの領域 */ char *tp; for (i = 0; i <= 256; i++) { if (fgets(file_image, 256, fp) == NULL) { if (ferror(fp) != 0) { printf("ERROR: 読み込みに失敗しました。\n"); return 1; } } if (feof(fp) != 0) { break; } printf("%s\n", file_image); tp = strtok(file_image, ",\n" ); printf("%s\n", file_image); } fclose(fp); return 0; }

  • C フォームから受け取った値をクッキーで発行

    (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); } ---ソースここまで---

    • ベストアンサー
    • CGI
  • C言語の変数について

    C言語の変数について教えていただきたいです。 C言語で下記のような設定をした場合、変数A、Bに設定する値にはバイト数制限 はないのでしょうか? バイト数制限がなくなる場合、なぜそうなるのかを教えていただきたいです。 よろしくお願いします。 #include <stdio.h> void test( char **B); int main( int argc, char *argv[] ) { char *A = NULL; char *B = NULL; A = argv[1]; test( B ); return 0; } void test( char **B ) { strcpy(B, "ABCD"); return 0; }

  • エラーがないのに正常に動かない

    以前質問したのものです。 アドバイス等いただき、プログラムを修正しエラーをなくしました。 しかし、プログラムが動きません。。。 プログラムの動作は CSVファイルを読み込んで、処理をする。 CSVファイルは 単語1,数値データ 単語2,数値データ のようになっており、 これをsの配列に格納したいと思っています。 プログラムの内容は #include<stdio.h> #include <string.h> int main(void) { FILE *fp; char s[5][1000][2][256]; char tp[256]; char *ttp; int i=0,ii=0; if((fp=fopen("out1.csv","r"))==NULL){ printf("ファイルオープンできませんよ\n"); return -1; } while(fgets(tp,256,fp)!=NULL){ ttp=strtok(tp,","); strcpy(&s[0][ii][i][0],ttp); puts(&s[0][ii][i][0]); while (ttp != NULL ) { i++; ttp=strtok(NULL,","); if (ttp != NULL ){ strcpy(&s[0][ii][i][0],ttp); puts(&s[0][ii][i][0]); }}i=0; ii++;if(ii>=1000)break; } return(0); } です。 わけがわからなくなりました(泣 どこが原因なのかも書いていただけるとありがたいです。

専門家に質問してみよう