• 締切済み

fgetsについて

C始めて2ヶ月ほどの者です。 fgetsで入力された文字をエンターが入力されるまで取得するという事をしたいのですが、どうしたら良いでしょうか? 例で言うとfgets(**,32,**)として最後の\nを過ぎた分もまた取得したいです。 この場合32文字を越えるごとに、その文字列をstrcatでくっつけるとかしたら出来そうかなと思ったのですがなかなか上手くいきません。 どのように考えたら良いのかご教授お願いいたします。

みんなの回答

回答No.3

えっと、標準入力ですよね? これをファイル入出力で応用させるためには、少しだけテクニックがいります。 基本的に、unix系(linux系を含む)は改行に'\n'を用います。 ところが、windows系では行頭復帰も含んでしまう場合があります。 従って、改行コードを削除する文の下に以下のソースを加えてみてください。 //行頭復帰を阻止する if( (n=(strchr(line1,'\r')) ) *n = '\0'; 以上です。でわ。

すると、全ての回答が全文表示されます。
回答No.2

一応,[続きの質問]は禁止事項だと思われるので,次からは注意してくださいね. 質問に対する回答ですが,fgetsで取得する文字列を格納するのに,毎回動的確保を行ったのではオーバヘッドが増大するだけです. なので,一度は変数の宣言場所で動的確保を行った後,必要な箇所で伸張するほうがいいように思われます. #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_LEN 32 int main(void){ char *line1=(char *)calloc(MAX_LEN,sizeof(char)); char *line2=(char *)calloc(MAX_LEN,sizeof(char)); char *n; *line2 = '\0'; while( (fgets(line1, MAX_LEN-1, stdin)) ){ /* 改行文字を削除 */ if( (n = strchr(line1, '\n')) ) *n = '\0'; printf("line1:%s\n",line1); line2 = (char *)realloc(line2, strlen(line2)+strlen(line1)); strcat(line2, line1); printf("line2:%s(%d chars)\n",line2,strlen(line2)); } free(line1); free(line2); return 0; } 【ソースについての補足】 line2に関しては最初にMAX_LENだけの動的確保をしていますが,1つだけでも構わないと思います. また,「line1とline2の文字数の和」だけ動的に再確保しています. これでよろしかったですか?

tetsu666
質問者

補足

どうやら少し動きがちがうようです。 自分でも考えたのですが、ループで\0を越えた部分のポインタが書き換えられてしまって上手くいかないです。。。。 ここまでくるとロジックの問題ですかねぇ。 なかなかどのように動いてるのか頭が回らないですね。。。

すると、全ての回答が全文表示されます。
回答No.1

こんにちは。 説明があまり上手くできないのでソースを簡単に作ってみました。 「エンターが」ということは標準入力ということですね。 つまり、"\n"を消してからstrcatでくっつければいいのではないでしょうか。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_LEN 32 int main(void){ char line1[MAX_LEN]; char line2[MAX_LEN*2]; char *r; char *n; *line2 = '\0'; while( fgets(line1, MAX_LEN-1, stdin) ){ /* 改行文字を削除 */ if( (n = strchr(line1, '\n')) ) *n = '\0'; printf("line1:%s\n",line1); strcat(line2, line1); printf("line2:%s\n",line2); } return 0; } また、標準入力以外からの入力にも対応したものも作ってみました。 参考程度にどうぞ。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_LEN 100 int main(void){ char line1[MAX_LEN]; char line2[MAX_LEN*2]; char *r; char *n; FILE *fp; if( (fp=fopen("oshiete.txt", "r")) ){ printf("File Open successed!\n"); } else { printf("File NOT Open...\n"); exit(-1); } *line2 = '\0'; while( fgets(line1, MAX_LEN-1, fp) ){ /* 行頭復帰文字を削除 */ if( (r = strchr(line1, '\r')) ) *r = '\0'; /* 改行文字を削除 */ if( (n = strchr(line1, '\n')) ) *n = '\0'; printf("line1:%s\n",line1); strcat(line2, line1); printf("line2:%s\n",line2); } return 0; }

tetsu666
質問者

補足

ありがとうございます! 標準入力で更に全体の文字列も、32文字ごとの文字列もメモリを動的に確保したいのですが、どうしたらよいでしょうか?

すると、全ての回答が全文表示されます。

関連するQ&A