• 締切済み

強制終了されていまいます。

標準入力された1行を"<"から">"までと文字のところにわけるプログラムを書いたのですが、コンパイルして実行して入力すると、画面が黒くなって止まってしまいます。以下のところが問題の部分だと思うんですが、理由がわかりません。よろしくお願いします。 while(fgets(buf, 1024, stdin) != NULL){ i = 0; j = 0; while(buf[i] != '\n' || buf[i] != '\0'){ if ((x = (char *)malloc(sizeof(char))) == NULL){ printf("malloc error\n"); exit(1); } if(buf[i] == '<'){ j = i; while(buf[j] != '>'){ j++; } strncpy(x, &buf[i], j-i+1); i = j + 1; x[strlen(x)] = '\0' putRear(deq, x); } else if(isalpha(buf[i])){ j = i; while(buf[j] != '>'){ j++; } strncpy(x, &buf[i], j-i); i = j + 1; x[strlen(x)] = '\0'; putRear(deq, x); } } }

みんなの回答

  • nerosuke
  • ベストアンサー率33% (39/115)
回答No.4

無限ループでallocしてるので、動作の保障がされません。 ひたすらメモリを壊してます。 基本的にメモリの確保と開放は入口と出口におきましょう。 必要な文字数分だけ、1バイトづつメモリを確保したいんだと思いますが、通常そういうことはせず、ある程度まとめて確保します。 そして確保した以上のメモリへのアクセスをエラーではじく処理を いれます。 どうしても必要以上にメモリを確保したくないのなら、先に<から>までの文字数をカウントして確保してください。

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.3

No.2です。補足拝見しました。 まず、C言語には「文字列型」というものは存在せず、文字列とはchar型の配列、ということはご理解いただいていますよね。そして、文字列の終端を示すのが'\0'です。 たとえば、 char x[10]; と宣言して、 strcpy(x,"abc"); とコピーしたら、 x[0] = 'a' x[1] = 'b' x[2] = 'c' x[3] = '\0' というコピーが内部的に行われます。 では、この状態でstrlen(x)で文字列の長さを取得しようとすると、strlen()の内部では、 「x[0]から1バイトずつ内容をチェックしながら文字数を数えていき、'\0'が来たらそこが文字列の終端として、その手前までの文字数を返す」 ということが行われます。 つまり、strlen(x)で文字列の長さを取得しようとするときには、すでに最後に'\0'がセットされていなければなりません。 その'\0'をセットするのに、strlen(x)を使っている、というのが矛盾なのです。 では、どう修正したらいいか、ですが、直前でstrncpy()でiとjの値を使ってxに長さを指定してコピーしていますよね。ということは、'\0'をセットするのに、strlen(x)を使わず、iとjの変数を使えばできるはず、ということです。 パソコンがシャットダウンするとは思いませんでした。「画面が黒くなって止まってしまう」とだけ書いていたので。ちょっと間違ったコードを書いたくらいでLinuxがシャットダウンするとは思えないのですが…。 現象はよくわかりませんが、原因は、malloc()で1バイト分しかメモリを確保していないのに、そこに1バイト以上の文字列をコピーしようとしたので、不正なメモリアクセスとなり、不正な動作となったのでしょう。普通ならSegmentation Faultなどでプログラムの実行自体が中断されるはずなのですが。

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.2

えっと、突っ込みどころの多いプログラムですが、とりあえず???と思ったところだけ指摘します。どう直せばいいのかは、ご自分で考えてみてください。わからなかったら助け船は出します。 while(buf[i] != '\n' || buf[i] != '\0'){ これって常に真ですよね。 if ((x = (char *)malloc(sizeof(char))) == NULL){ これもNo.1の方の言うとおり、charのサイズ、すなわち1バイト分しかメモリを確保できてません。 x[strlen(x)] = '\0' コピーした文字列の最後に'\0'を代入したいのですよね。 strlen()というのは文字列の長さを取得する関数ですが、その文字列の長さは内部的にどうやって取得しているか考えると、上記の記述はおかしなことに気がつくかと思います。 それから、 ・malloc()したらきちんとfree()しましょう。 ・エラーは標準出力でなく標準エラー出力に出した方がいいでしょう。

123ppp
質問者

補足

回答ありがとうございます。一つ目と二つ目の間違いは理解できました。三つ目がいまいちなので、ヒントをください。 それと、パソコンがシャットダウンしてしまう原因は何だったんですか?環境はvine-linux3.2です。

noname#22058
noname#22058
回答No.1

mallocで確保した領域は1バイト分しかありません。 それでよいのでしょうか。

関連するQ&A

  • ファイルに文字列を書く

    ファイルを2つ読み込んでファイルを書き直そうとしたのですが 2度目に書き込もうとしたときに改行の書き込みがおかしくなってしまいます してほしいところで改行を一回だけしてほしいと思っているのですが 実際には多数改行されます どうしたら改行が一回だけになりますか? ---ソース--- #include <stdio.h> void main(void){ FILE *fp; char *tm[1000]; char buf[400]; int i=1,sei; fp= fopen("now.txt","w+"); fprintf(fp,"もも"); fclose(fp); //何で最初に書き込んでるんだ? //という突っ込みがあるでしょうが本当に作りたいプログラムは最初にファイルに書き込まないといけないためです。 fp= fopen("now.txt","r"); while( fgets( buf, 400, fp ) != NULL ){ tm[0]=(char*)malloc(strlen(buf)+1); strcpy(tm[0], buf); } fclose(fp); fp =fopen("moto.txt","r"); while( fgets( buf, 400, fp ) != NULL ){ if(i<999){ tm[i] = (char*)malloc(strlen(buf+1)); strcpy(tm[i], buf); i++; } else{ tm[999] = (char*)malloc(strlen(buf+1)); strcpy(tm[999], buf); } } fclose(fp); if(i<1000){ sei=i; } else{ sei=1000; } fp =fopen("chat_deta.txt","w+"); for(i=0;i<sei;i++){ fprintf(fp,"%s\n",tm[i]); } if(i!=(sei-1)){ fprintf(fp,"\n"); } for(i=0;i<sei;i++){ free(tm[i]); } fclose(fp); } } ---now.txt--- もも ---moto.txt--- オレンジ みかん

  • 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
  • 続jファイルに文字列を書く

    あれから後一歩と言うところにきました たぶんmallocのバグだと思いますがチャットのシステムを作ろうとしているのですが 読み込み時にエラーになります ソースの注目部分を見てほしいのですが、 注目部分はbuf+1 にすると 文字列が1文字ずつ消えていくバグになり bufにすると 3行目を書き込んだ時点で3行目がの頭の部分の文字列がおかしくなり4行目を書き込もうとするとエラーになります ちゃんと動作するにはどのように書けば良いですか? ---ソース--- #include <stdio.h> void main(void){ FILE *fp; char *tm[1000]; char buf[400]; int i=1,sei; fp= fopen("now.txt","w+"); fprintf(fp,"もも"); fclose(fp); //何で最初に書き込んでるんだ? //という突っ込みがあるでしょうが本当に作りたいプログラムは最初にファイルに書き込まないといけないためです。 fp= fopen("now.txt","r"); while( fgets( buf, 400, fp ) != NULL ){ tm[0]=(char*)malloc(strlen(buf)+1); strcpy(tm[0], buf); } fclose(fp); fp =fopen("moto.txt","r"); while( fgets( buf, 400, fp ) != NULL ){ tm[i] = (char*)malloc(strlen(buf+1)); strcpy(tm[i], buf+1); //ここを注目 if(i<999){ i++; } } fclose(fp); if(i<=1000){ sei=i; } else{ sei=1000; } fp =fopen("moto.txt","w"); for(i=0;i<sei;i++){ if(i==0){ fprintf(fp,"%s\n",tm[0]); } else{ fprintf(fp,"%s",tm[i]); } } } ---now.txt--- もも ---moto.txt--- オレンジ みかん

  • 英語入力するプログラム

    月名の日本語を入力して英語にするプログラムを書こうとしている のですが、うまく動作しません。 たとえば。 「3月:」と表示されたら大文字か小文字、もしくは組み合わせで marchと入力すれば「正解です。」と表示されるようにです。 具体的には、ランダムで月名が表示されていくのですが何を入力しても 正解と表示されてしまいます。 たとえば、marchなのにdなどと入力しても正解になってしまいます。 何がおかしいのでしょうか? #include<stdio.h> #include<time.h> #include<stdlib.h> #include<ctype.h> #include<string.h> #define swap(type,x,y) do{type t=x;x=y;y=t;}while(0) char *tukistr[]={"January","Feburary","March","April","May","June","July", "August","September","October","November","December"}; int main(void) { char nstr[12]={0,1,2,3,4,5,6,7,8,9,10,11}; char tuki[10]; int num; int seikai=0; int k=0; int seiho[12]; int huseiho[12]; int m=0; int i,j; srand(time(NULL)); printf("月名の英語を入力してください。入力は大文字でも小文字でも構いません。\n"); for(i=11;i>0;i--) { j=rand()%i; swap(int,nstr[j],nstr[i]); } for(i=0;i<12;i++) { printf("%d月 : ",nstr[i]+1); scanf("%s",tuki); do{ for(j=0;j<strlen(tuki);j++) { if(isalpha(tuki[j])!=isalpha(tukistr[nstr[i]][j])) { printf("違います。正解を見ますか? 0-いいえ/1-はい:"); scanf("%d",&num); if(num==1) { huseiho[m++]=nstr[i]; } break; } } }while(num==0 && j<strlen(tuki)); if(j==strlen(tuki)) { printf("正解です。\n"); seikai++; seiho[k++]=i; } else if(num==1) { printf("%d月は%sです。\n",nstr[i],tukistr[i]); } } printf("12個のうち%d個が正解でした。\n",seikai); printf("正解した月:"); for(j=0;j<12;j++) { if(j==seiho[j]) { printf("%d月,",j+1); } } printf("\n\n"); printf("間違えた月:"); for(j=0;j<12;j++) { if(j==huseiho[j]) { printf("%d月,",j+1); } } return 0; }

  • 動かないです

    おかしなところが有ったらアドバイス・修正等お願いします。 うしろ3行を表示させたいです。 0~2行の場合はその分だけ表示させたいです。 # include <stdio.h> # include <stdlib.h> # include <string.h> char *getline(void) { char *buf = NULL; int size = 0; int oldsize; do { oldsize = size; size = size * 2 + 80; buf = realloc(buf, size + 1); if(!buf) { fprintf(stderr, "memory allocation failed\n"); exit(1); } if(!fgets(buf + oldsize, size + 1 - oldsize, stdin)) if(oldsize) break; else { free(buf); return NULL; } }while(strlen(buf + oldsize) == size - oldsize); return buf; } void scan(char **lines, int n_lines) { char *p; int i; for(i = 0; i < n_lines; i++) lines[i] = NULL; while(p = getline()) { free(lines[0]); for(i = 0; i < n_lines - 1; i++) lines[i] = lines[i+1]; lines[n_lines - 1] = p; } } void print(char **lines, int n_lines) { int i; for(i = 0; i < n_lines; i++) if(lines[i]) fputs(lines[i], stdout); } int main(void) { char *lines[3]; int i; scan(lines, 3); print(lines, 3); for(i = 0; i < 3; i++) free(lines[i]); return 0; }

  • fclose()でセグメンテーション違反

    C言語でのファイル読み込みで、ファイルを開いてデータを読み込んで表示することはできたのですが、最後のfclose(fp)でセグメンテーション違反になります。一番最後のwhileループをコメントアウトしたところセグメンテーション違反にはならなかったので、ここに何か問題があると思うのですが、どこが悪いのかが分かりません... #include<stdio.h> #include<stdlib.h> main(void){ FILE *fp; int i=0 , j=0 ,cnt = 0 , c=0; char *name="data.txt"; float *buf1,*buf2; if((fp = fopen(name,"r")) == NULL){ printf("error\n"); return 0; } else{ while((c = getc(fp)) != EOF) { if(c == '\n') cnt++; } printf(">>%d<<\n",cnt+1); rewind(fp); buf1 = (float *)malloc( (int)(cnt/2) +1); buf2 = (float *)malloc( (int)(cnt/2) +1); /*ここからがおかしい?*/ while(1){ if( fscanf( fp ,"%f %f",&buf1[i],&buf2[i])==EOF )break; printf("%f %f\n",buf1[i],buf2[i]); i++; } fclose(fp); } return 0; } なぜセグメンテーション違反になっているのでしょうか?

  • 関数化

    #include <ctype.h> #include <string.h> #include <stdlib.h> void swap(char p[], char q[]); char *get(char *str, char buf[], int line, int field); typedef struct { int number; char *class_type; char* name; char *subject; } my; my *data; int main(int argc, char* argv[]) { FILE *fp; int field = 0, line = 0; char buf[1000], *str; char *bufG; int line2 = 0; if((fp=fopen("test3.csv","r"))==NULL){ printf("ファイルが開けません"); } while(fgets(buf, 1000, fp) != NULL){ line2++; } fclose(fp); printf("%d\n", line2); if((fp=fopen("test3.csv","r"))==NULL){ printf("ファイルが開けません"); } data = (my *)malloc(sizeof(my) * line2); while(fgets(buf,1000,fp) != NULL){ str = buf; while(*str != '\0'){ bufG = get(str, buf, line, field); switch(field){ case 0: data[line].number = atoi(bufG); break; case 1: data[line].class_type = (char *)malloc(strlen(bufG) +1); strcpy(data[line].class_type, bufG); break; case 2: data[line].name = (char *)malloc(strlen(bufG) + 1); strcpy(data[line].name, bufG); break; case 3: data[line].subject =(char *)malloc(strlen(bufG) + 1); strcpy(data[line].subject, bufG); break; } str++; field++; } line++; field = 0; } fclose(fp);     for(int m = 1; m < line; m++){ printf("%d\n", data[m].number); printf("%s\n", data[m].class_type); printf("%s\n", data[m].name); printf("%s\n", data[m].subject);     } return 0; } char *get(char *str, char buf[], int line, int field) { char bufG[1111]; int i; for(i = 0; *str != ',' && *str != '\0' ; i++){ if(*str == '\n'){ bufG[i] = '\0'; } else{ bufG[i] = *str; } str++; } bufG[i] = '\0'; return bufG; } 前回の質問 http://okwave.jp/qa5094929.html で提示していただいたサンプルの関数化をはかりましたが うまくいきません。これを実行すると1しか表示されません。 原因はおそらくポインタだと思いますがどうすればいいのか わかりません。教えて下さい。bufを引数にする意味ないのでは という意見は今の所はとりあえずなしで fieldの値によってbufGが色々とってくる。 例えば1,A,山田,数学の場合 field = 0のときbufGは1 filed=1のときbufGはA field=2のときbufGは山田 filed=3のときbufGは数学という ような値が返ってくるようにしたいです。

  • ポインタ(続)

    http://okwave.jp/qa5092628.html の続きです。 #include "stdafx.h" #include <ctype.h> #include <string.h> #include <stdlib.h> typedef struct { int number[6]; char *class_type; char *name; char *subject; } my; int main(int argc, char* argv[]) { FILE *fp; int field = 0, line = 0; char buf[1000], *str; char *bufNum,*bufClass,*bufName,*bufSub; int i; if((fp=fopen("test.txt","r"))==NULL){ printf("ファイルが開けません"); } my *data; data = (my *)calloc(112, sizeof(my)); if(!data){ printf("memoryが足りません\n"); } while(fgets(buf,1000,fp) !=NULL){ str=buf; bufNum = (char *)malloc(strlen(buf) + 1); bufClass = (char *)malloc(strlen(buf) +1); bufName= (char *)malloc(strlen(buf) + 1); bufSub = (char *)malloc(strlen(buf) +1); while(*str != '\0'){ if(*str != ','){ for(i = 0; *str != ',' && *str != '\0' ; i++){ if(*str == '\n'){ } else{ switch(field){ case 0: *bufNum = *Str; data[line].number[line] = atoi(bufNum); break; case 1: *bufClass= *str; data[line].class_type = bufClass; break; case 2: *bufName = *str; data[line].name = bufName; break; case3: *bufSub = *str; data[line].subject = bufSub; break; } } str++; } switch(field){ case 0: bufNum[i] = '\0'; break; case 1: bufClass[i] = '\0'; break; case 2: bufName[i] = '\0';break; case 3: bufSub[i] = '\0'; break; } field++; } else{ str++; } } line++; field = 0; } printf("%s", data[0].name); fclose(fp); return 0; } と作ってみましたがまぁこれも上手く動かないんですが・・ 1、構造体をつくる 2、構造体のメモリをとる 3、ファイルをよみこむ 4、ポインタで宣言した構造体のメンバのメモリをとり実体をつくる 5、一行ずつよみこむ 6、カンマごとに格納 7、格納後終端文字を入れる 格納の区別はカンマごとにfieldを+しfieldの値にて行なう lineは行数 8,printfでテスト表示 終わり という一連のプログラムです。 class_typeまでは正常にでるんですが nameからが入っていません。 他にもここが微妙とかいうのがあったら教えて下さい。 個人的にはbufNum~bufSubのメモリの取り方が大きすぎる とは思うんですが他にいい手もなくて・・

  • get()を否定されました…どのように直せばいいでしょうか…

    プログラムで、文中のpikatyuという文字をraityuに変換させるプログラムを作れという問題で、以下のプログラムを作成しました。 すると、警告文で prog.c: In function 'main': prog.c:14: warning: unused variable 'c' prog.c:33: warning: control reaches end of non-void function /var/tmp//cc1HByZn.o(.text+0x51):Infunction 'main': : warning: warning: this program uses gets(), which is unsafe. というものが出てきました。 コンパイルはできるのですが、 講師がgets()を使うなと言うのです。 どのようにすれば認めてもらえるのでしょうか? どこをどのように直せばいいか教えてください。お願いします。 #include<stdio.h> #include<string.h> #define SIZE 512 char *search(char *,char *); void replacce(char *,char *,char *); int main(int argc,char, **argv) { char c; int i = 0, j = 0; char a[SIZE][SIZE]; for (i = 0; i < SIZE; i++) { gets(a[i]); } while(a[j][0] != '\0') { replace(a[j],"pikatyu","raityu"); printf("%s\n", a[j]); j++; } } void replace(char *text, char *key, char *rep) { char *p,buf[SIZE]; p = search(text, key); while(p != NULL) { *p ='\0'; strcpy(buf, p + strlen(key)); strcat(text, rep); strcat(text, buf); p = search (p + strlen(rep), key); } } char *search(char *text, char *key) { int m, n; char *p; m = strlen(text); n = strlen(key); for(p = text; p <= text + m - n; p++) { if(strncmp(p, key, n) == 0) return (p); } return (NULL); }

  • reallocの断片化対策について

    初めにお断りしておきたい事があります。 出先で緊急な事でしたので、今即興で書いたソースになります。 Cコンパイル環境が有りませんでしたので、動作確認がとれておりません。 その為、ケアレスミス等有るかもしれませんがご容赦願います。 例として標準入力より文字列を取得する処理を記述しました。 以下の処理でreallocの際の断片化対策となるでしょうか。 (最終的に*strにセットされている領域が断片化されていない事) 実際の処理では1行辺り0~30000文字程の可変長の文字列を読み込む事を想定しております。 C(windows)のみ可でC++は不可になります。 その他、冗長な記述等指摘が有りましたらよろしくお願い致します。 #define MAX_BUF_SIZE 128 int getText(char **str) { char *buf[MAX_BUF_SIZE]; char *tmp = NULL; int tmpsize = 0; if ((tmp = (char*) malloc(1)) == NULL) { return FALSE; } *tmp = '\0'; while (fgets(buf, MAX_BUF_SIZE, stdin) != NULL) { tmpsize += MAX_BUF_SIZE; if ((tmp = realloc(tmp, tmpsize)) == NULL) { free(tmp); return FALSE; } strcat(tmp, buf); } if (*str != NULL) { free(*str); } if (*str = (char*) malloc(strlen(tmp) + 1) != NULL) { return FALSE; } strcpy(*str, tmp); free(tmp); return TRUE; }

専門家に質問してみよう