質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

530閲覧

キーボードから入力された文字列を配列に格納したい

hello_whats_up

総合スコア57

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/01/17 13:03

わからないこと

キーボードからfgetで入力された文字列を保存したいです。
改行されるまでが一行(最大200バイト)として、何行でも保存して最後にそれらすべてをそのまま出力します。

できたこと

1行だけの入力は以下のようにして入力+出力させました。

int main(void) { //バッファのサイズは200バイト char buffer[200]; printf("文字列を入力: "); if (fgets(buffer, 200, stdin) == NULL) { return 1; } printf("文字列を出力: %s\n", buffer); return 0; }

これを何行も入力、保存させれるようにしたいです。

その方法がわからないので教えていただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2020/01/17 13:06

なにをもって"入力の終わり"としますか?
cateye

2020/01/17 13:16

>何行でも・・・・上限はないのですか?
hello_whats_up

2020/01/17 13:21

すみません説明不足です。 入力の終わりは先頭文字が"."で始まる文字列が入力されたときです。 上限については、とりあえず特に指定は有りません。
guest

回答2

0

ベストアンサー

こんなもんですかねぇ...

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5char* get_multiline() { 6 char* buffer = NULL; 7 size_t size = 0; 8 size_t capacity = 0; 9 char line[200]; 10 while ( fgets(line, 200, stdin) != NULL ) { 11 if ( line[0] == '.' ) break; 12 int len = strlen(line); 13 if ( size + len > capacity ) { 14 capacity = (capacity == 0) ? size+len+1 : capacity*2; 15 buffer = realloc(buffer, capacity); 16 if ( buffer == NULL ) return NULL; 17 } 18 strcpy(buffer+size, line); 19 size += len; 20 } 21 return buffer; 22} 23 24int main(){ 25 char* buffer = get_multiline(); 26 printf("[%s]\n", buffer); 27 free(buffer); 28 return 0; 29}

実行結果:

abc
def
ghi
.  ←入力ココマデ
[abc
def
ghi
]

投稿2020/01/17 13:42

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hello_whats_up

2020/01/17 13:59

ありがとうございます。解決できました。
episteme

2020/01/17 16:18

あ、スンマセン。 char* tmp = realloc(buffer, capacity); if ( tmp == NULL ) { free(buffer); return NULL } else { buffer = tmp; } てなとこで勘弁してくだされ
cateye

2020/01/17 16:21

(>Д<)ゝ”ラジャー!!
episteme

2020/01/17 16:25

> capacity = (capacity == 0) ? size+len+1 : capacity*2; これもなんか自信ない。 capacity = (capacity == 0) ? len+1 : (capacity*2 + len); が無難かなー...
guest

0

納得C言語の例題2を参考にしたらいかがでしょうか。
この例はファイルを読み込むだけですが、これに格納するコードを追加すればよいと思います。
そのためには、格納する領域(配列)の定義と、読み込み最大行数を指定してください。最大行数がないと変になりますので。
なを、「保存」はファイル保存を連想させるので「格納」の方がよいです。

投稿2020/01/17 13:38

ikapy

総合スコア1167

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問