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

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

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

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

389閲覧

学びたてで、C言語環境で配列に値を入れたいんですが。

yowashi

総合スコア19

C

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2017/06/22 07:43

編集2017/06/22 08:23

###前提・実現したいこと
二進数を加算処理するプログラムを作成するのですが、入力された二進数を配列にいれて、全加算器の処理を加えて配列の中身ごと計算して10進数表示、加算しようと考えています。
それぞれの処理を分けて関数として扱いたいため、メインでは呼び出すだけにしたいと思っています。
###発生している問題・エラーメッセージ
a[]、b[]の配列にアクセスして関数内で入力、表示、格納したarr[]をa、bに返す処理をしたいのですが、分けて書く際の、引数や動作がうまくいきません。
また、void文の使い分けがよくわかりません。例題の数字入れ替えのswapでは変数二文字の入れ替えで、voidを使っていたので今回も使用してみましたが、配列処理を返す場合は戻り値のあるintで宣言するべきでしょうか。

###該当のソースコード

#define _CRT_SECURE_NO_WARNINGS #define MAXBIT 8 //8桁までの入力を可能にする void Array(int*); //配列要素ごとに文字を格納、数字に変換し、出力する関数 int main() { int a[MAXBIT] = { 0 }; //一つ目の二進数を格納する配列 int b[MAXBIT] = { 0 }; //二つ目 printf("一つ目の二進数は "); Array(a); //Array呼び出し printf("二つ目の二進数は "); Array(b); return 0; } void Array(int *Array) { int Arr[MAXBIT] = { 0 }; int i; //配列のi番目 for (i = 0; i < MAXBIT; i++) //8桁までの入力を受け付け処理 { Arr[i] = _getch(); //a[i]に入力"文字"を格納 if (Arr[i] == '\r') //エンタ-(cr)が入力された場合は処理を抜ける { Arr[i] = '\0'; //cr入力を'0'に変える break; } Arr[i] = Arr[i] - '0'; //"文字"で入力されたコードを数字に変換し格納 printf("%d", Arr[i]); //入力文字の表示 } puts("\n"); }``` ###試したこと 作成したarrayの動作不良かと思い、mainに組み込み、arrをそれぞれ、a,bに書き換えるとと入力、表示、配列への格納はうまくいきました。 ###補足情報(言語/FW/ツール等のバージョンなど) より詳細な情報 ###前提・実現したいこと ここに質問したいことを詳細に書いてください (例)PHP(CakePHP)で●●なシステムを作っています。 ■■な機能を実装中に以下のエラーメッセージが発生しました。 ###発生している問題・エラーメッセージ

エラーメッセージ

###該当のソースコード ```ここに言語を入力 ここにご自身が実行したソースコードを書いてください

###試したこと
課題に対してアプローチしたことを記載してください

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

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

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

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

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

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

yowashi

2017/06/22 08:03

申し訳ないです。
LouiS0616

2017/06/22 08:11

いえ、日本語の読点ではなく、`です。SHIFT+@で入力します。また、コードの終わりにも入力してください。
guest

回答3

0

既に回答が出た後ですが一応。
_getch を使っていますが、バックスペースキーを押されて戻るなど考えると今後大変だと思います。
一度行で読み取ってから処理されると良いと思います。

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <math.h> 4 5#define _MAXBIT 8 // 8桁までの入力を可能にする 6 7int input_array(int*); //配列要素ごとに文字を格納、数字に変換し、出力する関数 8 9int 10main() { 11 int a[_MAXBIT] = { 0 }; //一つ目の二進数を格納する配列 12 int b[_MAXBIT] = { 0 }; //二つ目 13 int i; 14 int r; 15 16 printf("一つ目の二進数は "); 17 r = input_array(a); 18 if (r != 0) { 19 fputs("入力内容が不正です", stderr); 20 exit(1); 21 } 22 printf("二つ目の二進数は "); 23 r = input_array(b); 24 if (r != 0) { 25 fputs("入力内容が不正です", stderr); 26 exit(1); 27 } 28 29 // 結果を表示 30 for (i = 0; i < _MAXBIT; i++) { 31 if (i > 0) putchar(','); 32 printf("%d", a[i]); 33 } 34 puts(""); 35 for (i = 0; i < _MAXBIT; i++) { 36 if (i > 0) putchar(','); 37 printf("%d", b[i]); 38 } 39 puts(""); 40 return 0; 41} 42 43int 44input_array(int *arr) { 45 int i; 46 char buf[_MAXBIT+1] = {0}; 47 48 fgets(buf, _MAXBIT, stdin); 49 for (i = 0; i < _MAXBIT && buf[i] != '\n'; i++) { 50 // 2進数なので 0 か 1 しか許さない 51 if (buf[i] != '0' && buf[i] != '1') 52 return -1; 53 arr[i] = buf[i] - '0'; 54 } 55 return i == _MAXBIT; // 8桁入れないとエラーとする 56}

投稿2017/06/22 08:26

mattn

総合スコア5030

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

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

yowashi

2017/06/22 08:28

ありがとうございます。そうですよね。今は勉強中ですが、今後業務でやることになるので、エラーを考えて組めるようにしようと思います。
guest

0

ベストアンサー

関数の引数に対して更新してあげれば良いだけだと思います。

c

1void Array(int *pArray) 2{ 3 int i; //配列のi番目 4 for (i = 0; i < MAXBIT; i++) //8桁までの入力を受け付け処理 5 { 6 pArray[i] = _getch(); //a[i]に入力"文字"を格納 7 if (pArray[i] == '\r') //エンタ-(cr)が入力された場合は処理を抜ける 8 { 9 pArray[i] = '\0'; //cr入力を'0'に変える 10 break; 11 } 12 pArray[i] = pArray[i] - '0'; //"文字"で入力されたコードを数字に変換し格納 13 printf("%d", pArray[i]); //入力文字の表示 14 } 15 puts("\n"); 16} 17

投稿2017/06/22 08:05

ttyp03

総合スコア16998

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

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

0

いまいちはっきりとはわかっていませんが、void宣言をintにして、戻り値を受け取った配列のポインタ、また関数内のArr[]はいらないと思ったので、関数内のArrを引数として受け取るArrayに変えたところ、無事格納できました。
まだアドレスやポインタの部分の理解が甘いようです。

投稿2017/06/22 08:00

yowashi

総合スコア19

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

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

LouiS0616

2017/06/22 08:05

アドレスとかポインタ以前に、関数内で引数にノータッチなので変化がないのは当たり前では...? 私の解釈が誤っているのでしょうか。
yowashi

2017/06/22 08:12

そうですね、中で改めて配列を定義するものだと勘違いしていました。
LouiS0616

2017/06/22 08:15

あと、戻り値をポインタにするのはあまりお勧めしませんよ。 値の本体がスコープ外に移動するとき(関数から出るとき)破棄されるので、下手に使うといわゆるヌルポに泣かされます。
yowashi

2017/06/22 08:26

今後、無事に回すことを考えたらどうしたらいいでしょうか。 配列そのものを返す際に戻り値にそのままArrayと書いても配列変数の添え字なしはポインタになるんですよね・・・?
LouiS0616

2017/06/22 08:29

ベストアンサーのように、引数をそのまま書き換えるのが一般的と思います。 ただ、引数がいきなり変化すると(少なくとも私は)ビビるので、コメントや引数名でわかるようにするといいかもしれません。
LouiS0616

2017/06/22 08:30

プロトタイプ宣言で、 void Array(int* dst); ってするとか。まあ好みによります。 言語それぞれの流儀みたいのがあるので、いろんなコードを見ると勉強になりますよ。
yowashi

2017/06/22 08:33

なるほど、ソースコードへのコメントの重要さは上からも言われたので耳が痛いです。今後戻り値にポインタはnotもふまえ、気をつけて組んでいきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問