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

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

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

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

組み込み開発

組み込み開発とは、スマートフォンや家電、自動車などに組み込まれているコンピューターシステムの開発のことです。特定の用途に特化しており、限られた機能のための開発を指します。組み込み開発で作られた機器を組み込み機器と呼び、近年ではPCのオペレーションシステム(OS)にも採用されています。

配列

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

Q&A

解決済

4回答

931閲覧

配列の要素をつなげて数桁の数字を作るやり方について(C言語)

Nyanmage.neko

総合スコア7

C

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

組み込み開発

組み込み開発とは、スマートフォンや家電、自動車などに組み込まれているコンピューターシステムの開発のことです。特定の用途に特化しており、限られた機能のための開発を指します。組み込み開発で作られた機器を組み込み機器と呼び、近年ではPCのオペレーションシステム(OS)にも採用されています。

配列

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

0グッド

0クリップ

投稿2023/11/28 23:33

実現したいこと

  • 配列の要素をつなげて、数桁の数字を作りたい

例えば、

int buf[]={2,5,4};
int buf2[]={0,1,3,5};
のような要素を持った配列があるとして、この配列から
int a = 254;
int b = 135;
のような値を作ることは可能でしょうか。

試したこと

char型で文字列の結合により値を作る方法は良く見ますが、数字としてそのまま扱う方法が見つからなかったので、
教えてください。

補足情報(FW/ツールのバージョンなど)

言語はC
開発環境はe2studio

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

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

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

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

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

guest

回答4

0

ベストアンサー

各要素の何れかが2桁以上あるケースの処理です。

C

1#include <stdio.h> 2int main(void) { 3 int buf[]={0,123,0,56,7}; 4 char temp[128]; 5 int i,n; 6 int a; 7 a = 0; 8 for (i = 0;i < sizeof(buf)/sizeof(int);i++){ 9 n = buf[i]; 10 do { 11 n = n / 10; 12 a = a * 10; 13 }while(n > 0); 14 a = a + buf[i]; 15 } 16 printf("a=%d\n",a); 17 return 0; 18} 19

実行結果
a=1230567

投稿2023/12/02 09:13

tatsu99

総合スコア5451

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

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

Nyanmage.neko

2023/12/02 09:26

ありがとうございます。割った結果を利用して何回10を掛けた値にするかを求めて計算していくのですね。場合分けではなく、計算結果のみを利用していてすごく見やすいコードですね。とても勉強になりました。
jimbe

2023/12/02 13:37 編集

(場合分けが発生するので消します、汚してごめんなさい)
Nyanmage.neko

2023/12/03 23:03

書き方が悪くて伝わらなかったですね。自分の頭の中で考えていたのは、*10や*100を定数で記載する「場合分け」になるかなと思っていたので、その部分も繰り返しで*10にしたり*100にしたりすることで、桁数が増えても対応できる書き方はすごく見やすいという意味です。
tatsu99

2023/12/03 23:24

>書き方が悪くて伝わらなかったですね。 回答者です。伝わってますよ。そこまで、お礼を述べられると、回答のし甲斐もあるというものです。 コメントありがとうございました。
guest

0

実装例です。

C

1#include <stdio.h> 2int main(void) { 3 int buf[]={2,5,4}; 4 int buf2[]={0,1,3,5}; 5 int i; 6 int a,b; 7 a = 0; 8 b = 0; 9 for (i = 0;i < sizeof(buf)/sizeof(int);i++){ 10 a = a * 10 + buf[i]; 11 } 12 for (i = 0;i < sizeof(buf2)/sizeof(int);i++){ 13 b = b * 10 + buf2[i]; 14 } 15 printf("a=%d\n",a); 16 printf("b=%d\n",b); 17 return 0; 18} 19 20

実行結果
a=254
b=135

投稿2023/11/29 01:35

tatsu99

総合スコア5451

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

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

Nyanmage.neko

2023/11/29 04:22

forループで値を足すたびに桁を繰り上げていく方法は初めて見ました。このやり方を模倣して、コードがかなりスッキリしました。ありがとうございました。
sazi

2023/11/30 04:48

配列の要素は一桁の数値、という前提で無いと駄目ですね。
Nyanmage.neko

2023/11/30 09:06

そうですね。現在の用途では問題ないですが、そうではない場合もいずれは考える必要がある可能性もあります。
tatsu99

2023/11/30 11:11

>そうではない場合もいずれは考える必要がある可能性もあります。 そのような場合、どのような結果を望まれるのでしょうか。
Nyanmage.neko

2023/12/02 06:25

配列の各要素の桁数を調べてから、今でいうところの`*10`となっているところを`*100`にしないと辻褄が合わなくなりますね。例えば、` = 100 * 10 + 26;`は1026となってしまいますが、本当であれば10026出ないといけないですよね。次のbuf[]の中身を確認して、その桁数によって`*10`の部分が変動するようにしなくてはいけないですね。そういう場合に直面した時には、このプログラムを基に場合分けを増やして計算しなくてはならないですね。
tatsu99

2023/12/02 06:43

int buf[]={0,123,0,56,7}; のとき、1230567の結果を望まれているということでしょうか。
Nyanmage.neko

2023/12/02 09:06

今は1桁のみで問題ないですが、もし複数桁の結合を行う場合は、そういう結果を望むことになりますね。
tatsu99

2023/12/02 09:09

その場合のサンプルを新たな回答欄に書いておきます。
guest

0

はい、可能です。
buf[0] * 100 + buf[1] * 10 + buf[2] buf2[0] * 1000 + buf2[1] * 100 + buf2[2] * 10 + buf2[3] のような計算をするようコードを組みましょう。

投稿2023/11/28 23:55

編集2023/11/29 00:04
int32_t

総合スコア20909

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

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

Nyanmage.neko

2023/11/29 00:03

やはりそのようなやり方になりますね。char型の結合のようにsprintf的なものがあるのかなと思っていましたが、コードのシンプルさ的にもベターですね。要素を渡して計算させる関数を作成することとします。ご回答ありがとうございました。
winterboum

2023/11/29 00:18

配列の大きさがプログラム作成時に確定しているなら上で十分ですが、どのくらいになるか不定なときは sum = 0 ; 配列から一つずつ取り出して num に入れ まだ有ったら sum = sum * 10 + num みたくしてください
Nyanmage.neko

2023/11/29 00:38

大きさは確定しています(可変長ではないです)。可変長用の応用を教えていただきありがとうございます。
jimbe

2023/11/29 04:24

=sprintf的なもの : >コードのシンプルさ的にも : >可変長ではないです 可変長の関数を作ったほうが応用(?)は効くでしょうね。
guest

0

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <ctype.h> 4#include <stdarg.h> 5 6int toInt(char *f, ...) { 7 va_list ap; 8 int v = 0; 9 va_start(ap, f); 10 //regex: a?\d?[boxd] 11 int isarray = *f == 'a' ? f++,1 : 0; 12 int len = isdigit(*f) ? *f++ - '0' : va_arg(ap, int); 13 int times = *f == 'b' ? 2 : *f == 'o' ? 8 : *f == 'x' ? 16 : 10; 14 if(isarray) { 15 int *a = va_arg(ap, int*); 16 for(int i=0; i<len; i++) v = v * times + *(a++); 17 } else { 18 for(int i=0; i<len; i++) v = v * times + va_arg(ap, int); 19 } 20 va_end(ap); 21 return v; 22} 23 24int main(void) { 25 int a[] = { 2, 5, 4 }; 26 printf("%d\n", toInt("a3d", a)); 27 printf("%d\n", toInt("ad", 3, a)); 28 printf("%d\n", toInt("a", 3, a)); 29 printf("%d\n", toInt("4d", 0, 1, 3, 5)); 30 printf("%d\n", toInt("d", 4, 0, 1, 3, 5)); 31 printf("%d\n", toInt("", 4, 0, 1, 3, 5)); 32 printf("%d\n", toInt("8b", 0, 1, 1, 0, 1, 1, 0, 1)); 33 printf("%d\n", toInt("3o", 1, 5, 5)); 34 printf("%d\n", toInt("2x", 0x6, 0xd)); 35}
254 254 254 135 135 135 109 109 109

投稿2023/11/29 09:44

編集2023/11/29 18:15
jimbe

総合スコア12659

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

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

Nyanmage.neko

2023/11/29 22:56

サンプルプログラムありがとうございます。上のコメントもありがとうございます。 現在は固定長ですが、可変長が必要になる可能性もあるので、頂いたプログラムを基に可変長でも作れるようにチャレンジしてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問