teratail header banner
teratail header banner
質問するログイン新規登録
C

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

5回答

15557閲覧

標準入力からの入力方法について

tsukacchan

総合スコア17

C

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/08/05 00:54

編集2016/08/05 01:44

0

0

以下のような行数の決まっていない数値を1つずつ標準入力から取得し(取得した数値はあとで利用したいので
全部まとめて配列などに入れて保持したい)ですが分かりませんでした。

1
5
-3
3
-2
-5
10

###試したこと
これがもし10行など行数が決まっていれば
例えばfor文と配列を用いて
for(int i=0; i < 10; i++) cin >> v[i];
などとすればいいと思うのですが。

どなたか分かる方ご教授よろしくお願いいたします。

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

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

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

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

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

coco_bauer

2016/08/05 02:26

「情報を全部保持したい」というのが配列等に保存したいう意味だとすれば、1)十分に大きな配列を用意する、2)メモリサイズの制限で大きな配列が確保できないのであれば順にファイルやDBに書き込んでゆく事になるとおもいます。 『保持』が何を意味しているのかを質問の中で説明した方が良いと思います。
tsukacchan

2016/08/05 03:57

今まで分からないことは自分で調べていたのですが、時間ばかりかかってなかなか前に進まないため、今回質問させていただきました。 質問したこと自体が初めてでしたので。あまり長い文章になってしまうと回答者の方が読みずらいとおもい、かえって面倒かけてしまったようで、申し訳ありませんでした。 細かく言うと今回質問は2つありました。 1 個数の決まっていない数値データの入力をどうするか(もし個数が決まってい  れば十分な大きさの配列を用意すればいい。) 2 入力の終了条件をどうコードで書けばよいか?   でした。 文章が苦手なのでうまく伝わらなかったのかも知れません。
guest

回答5

0

ベストアンサー

個数が決まっていない場合、「標準入力がEOFになったら入力終了」というようにすることが多いです。
WindowsならCtrl+Z、Unix系ならCtrl+Dを入力すると、標準入力がEOFとなります。

C++でいいのなら、こんな感じで入力した値を配列に格納できます。

C++

1std::vector<int> v; 2while(1) 3{ 4 int x; 5 std::cin >> x; 6 if(std::cin.eof()) 7 break; 8 9 v.push_back(x); 10}

STLのvectorクラスは一つずつデータを追加していく、という操作ができるので重宝します。

投稿2016/08/05 02:56

catsforepaw

総合スコア5944

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

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

tsukacchan

2016/08/05 03:43

回答ありがとうございます。 うまくいきました。 このvectorというのは便利ですね。
guest

0

C++、なのよね?

C++

1#include <sstream> 2#include <string> 3#include <vector> 4#include <iterator> 5#include <algorithm> 6#include <iostream> 7using namespace std; 8 9 10int main() { 11 12 string input = "1 \n 5 \n -3 \n 3 \n -2 \n -5 \n 10 "; 13 istringstream stream(input); 14 vector<int> result; 15 copy(istream_iterator<int>(stream), istream_iterator<int>(), back_inserter(result)); 16 17 // 確認 18 for ( int item : result ) { 19 cout << item << endl; 20 } 21}

投稿2016/08/05 03:04

episteme

総合スコア16612

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

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

0

一回文字列として読み込んで
文字列の長さが0までのあいだループとかにしたらいいんじゃないでしょうか?

C

1#include<stdio.h> 2#include<stdlib.h> 3 4int main() 5{ 6 int cnt, cnt2; 7 int val[1000]; 8 char in[10]; 9 10 for(cnt = 0; ; cnt++) 11 { 12 memset(in, 0, sizeof(in)); 13 14 scanf("%s", in); 15 16 if(0 < strlen(in)) 17 { 18 val[cnt] = atoi(in); 19 } 20 else 21 { 22 break; 23 } 24 } 25 26 for(cnt2 = 0; cnt2 < cnt; cnt2++) 27 { 28 printf("%d\n", val[cnt2]; 29 } 30} 31

※このコードには文字列が10ケタを超えた場合や整数値を1000個以上登録した場合に
にバッファオーバーフローを起こす問題があります
あくまで終わりを判定するための例ですのでそのあたりは適切に処理してください

投稿2016/08/05 01:47

kutsulog

総合スコア985

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

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

0

質問の要点は「個数が不明なデータを保持するには?」ということと思います。
まず、あまりおもしろくない方法として、
1.適当な要素数(10とか100とか)の配列を用意する
2.用意した配列がいっぱいになるまで、データを入力する
3.一杯になったら、もっと大きな配列を用意する(20個とか200個とか)
4.一杯になった配列から、新たに用意した大きな配列へ、データをコピーする
5.新しい配列の残りの空いている部分に、続いてデータを入れて行く

ですが、これは少しばかばかしい方法です。もう少しまともな方法は
1.データの入力があるごとに、格納する構造体を1個用意する
2.データを格納した構造体を順にリンクする
です。
これは「線形リスト」と呼ばれます。そのやり方は大抵の本には書いてあるので、
本屋、図書館で調べてください。
注:最初の方法でも、データの数が「大方はN個で十分間に合う」と予想できる場合は、それほどまずくはありません。

投稿2016/08/05 01:36

nob.

総合スコア711

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

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

0

簡単ですが、標準入力を受け付けて最後はctrl+dで終了します。
10件毎に保存メモリを拡張します

c

1void main(void) 2{ 3 int ret; 4 int cnt=0; 5 int *mbuf; 6 int ii; 7 mbuf = (int *)malloc(sizeof(int) * 11); 8 while( fscanf( stdin , "%d" , &ret) != EOF ) { 9 if ( cnt !=0 && cnt%10 == 0){ 10 mbuf = (int *)realloc( mbuf, sizeof(int) * (cnt * 2) ); 11 if( mbuf == NULL ){ 12 printf( "メモリ確保に失敗\n" ); 13 free( mbuf ); 14 return; 15 } 16 printf( "メモリ確保 %d\n", cnt ); 17 } 18 mbuf[cnt] = ret; 19 cnt++; 20 } 21 for (ii=0; ii<cnt; ii++){ 22 printf (" %d", mbuf[ii]); 23 } 24 free(mbuf); 25}

端末からの入力のできますが、パイプやリダイレクションでも良いです。
cat file1 | ./progA
./progA < file1

投稿2016/08/05 01:21

編集2016/08/05 03:04
A.Ichi

総合スコア4070

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問