
こんばんは、夜分遅くに失礼します。
タイトルの通り、C言語の桁数指定について質問です。
※数値の桁数が %5d などによって指定できる事は把握しています。
私が今書いているコードで、
「入力された数値の桁数によって、出力する際に見やすくなるよう桁数を指定する」
という事を試行しているのですが、
if(max>99){ 処理1
if(max>999){ 処理2
if(max>9999){ 処理3
if(max>99999){ 処理4
…
などのように場合分けして書くのは煩わしいと感じたので
define NUM 5 → %NUM5
などで代用できるか…?と思い試したところ案の定出来ませんでした。
ここでお聞きしたいのですが、場合分けせずに一つの処理で簡潔に書ける方法はありますでしょうか?
又、もし無い場合私の方法とは別で、何かいい方法はありますでしょうか?
何卒お力添えお願いします m(_ _)m
(文が読み辛かったり、誤字脱字等があれば大変申し訳ないのですが
ご指摘いただけるとありがたいです)
No.8ベストアンサー
- 回答日時:
printf のフィールド幅は '*' を使えば引数からも指定できます
例)
printf( "%*d", フィールド幅, 値 );
対数と丸めを活用すればフィールド幅を計算式で表せます
例)
フィールド幅 = 2 + (int)floor(log10(最大値));
最大値 = 9 → フィールド幅 = 2
最大値 = 10 → フィールド幅 = 3
最大値 = 99 → フィールド幅 = 3
最大値 = 100 → フィールド幅 = 4
参考)
https://linuxjm.osdn.jp/html/LDP_man-pages/man3/ …
https://linuxjm.osdn.jp/html/LDP_man-pages/man3/ …
https://linuxjm.osdn.jp/html/LDP_man-pages/man3/ …
No.8 さん(ベストアンサー)
%*dで指定…なるほど、そんなことができるんですね(;゚Д゚)
まさに私が求めていた方法です。ありがとうございます!
No.6の方も同じ事を書いてくださっていましたが、No.8さんが
コード書き方など詳しく書いて下さったのでこちらを
ベストアンサーとさせてください(。-人-。)
まだまだ分からない関数等沢山ありますが、少しずつ頑張ります。
皆様御回答ありがとうございました!
No.7
- 回答日時:
以下のようにしてはいかがでしょうか。
maxの桁数をstrlenで取得し、(maxが3桁なら)formへ"%4d"
の文字列を作成し、それを乱数印字時の書式として使います。
------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h> //追加
int random(int max, int min)
{
return (rand() % (max - min)) + min;
}
int main(void)
{
int min; /*乱数の最小値 */
int max; /*乱数の最大値 */
int number; /*乱数の個数 */
int x = 0; /*カウント用変数 */
char form[16]; //追加
char digit[16]; //追加
printf("min > ");
scanf("%d", &min);
printf("max > ");
scanf("%d", &max);
sprintf(digit,"%d",max); //追加
sprintf(form,"%%%dd",strlen(digit)+1); //追加
printf("number > ");
scanf("%d", &number);
if (min >= max) {
printf("error\n");
exit(0);
}
srand((int) time(NULL)); /*乱数リセット */
for (int i = 0; i < number; i++) {
if (x == 10)
printf("\n"); /*10個ごとに改行 */
printf(form, random(max, min)); //修正
x++;
}
return 0;
}
No.7 さん
strlen()とsprintf()の使用、なるほど…
sprintf()をあまり使用しないので考えつきませんでした(´・ω・`)
使い方等を熟知した上で考えさせてもらいます…!
No.5
- 回答日時:
あ、ごめん、手が滑ってヘンな事書いちゃったや。
#4 の
strtod(buf, NULL);
って書いてるトコは全部
strtol(buf, NULL, 10);
です。
何やってんだろ。
あと、オリジナルの
> if(x==10) printf("\n"); /*10個ごとに改行*/
ですが、forループの中にあるiを利用した方がいいです。
基本的iを10で割った余りが0になる時、10個表示し終えた、って事なんで、そこで改行させます。
No.4
- 回答日時:
うん、O.K.
まずね、もっとモダンな言語だと、恐らくハッシュテーブルとか使って処理するような事になると思う。
それで条件分岐を避けてprintfの文字列にハメるのね。
ただ、C言語はハッシュテーブルみたいなイケてるデータ型を持ってないんで、例えばこんな風に実装してみる。
/* ここから */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>
#include <string.h>
#define N 6
/* テーブル要素 */
typedef struct elm_ {
int v;
char* s;
} Elm_t;
/* データ変換テーブル */
Elm_t table[] = {{1, "%2d"}, {2, "%3d"}, {3, "%4d"},
{4, "%5d"}, {5, "%6d"}, {6, "%7d"}};
/* 検索関数 */
Elm_t assoc(int key, Elm_t* table, size_t size) {
for (size_t i = 0; i < size; i++) {
if (key == table[i].v) {
return table[i];
}
}
Elm_t false_result= {false, "%d"};
return false_result;
}
/* random と言う名前は衝突するので使えない(stdlib.h) */
int rndm(int max, int min) {
return rand() % (max - min) + 1;
}
int main(void) {
int min; /* 乱数の最小値 */
int max; /* 乱数の最大値 */
int number; /* 乱数の個数 */
int x;
char buf[10]; /* バッファ */
printf("min > "); scanf("%9s%*[^\n]", buf);
getchar(); min = strtod(buf, NULL);
printf("max > "); scanf("%9s%*[^\n]", buf);
getchar(); max = strtod(buf, NULL);
printf("number > "); scanf("%9s%*[^\n]", buf);
getchar(); number = strtod(buf, NULL);
if (min >= max) {
puts("error");
return EXIT_FAILURE;
}
srand((int)time(NULL));
for (int i = 0; i < number; i++) {
if ((i != 0) && (i % 10 == 0)) {
puts("");
}
x = rndm(max, min);
snprintf(buf, 10, "%d", x);
printf(assoc(strlen(buf), table, N).s, x);
}
puts("");
return EXIT_SUCCESS;
}
/* ここまで */
まず構造体でデータ要素を作る。数値と文字列を持ったデータ型だな。
それでデータテーブルを作る。1桁と"%2d"、2桁と"%3d"、・・・と言うカンジでペアのデータをセットしていく。
キーは数値で、例えば1桁の「1」が来ると{1, "%2d"}と言う要素(構造体)を返すような検索関数assocを作る。見つからなかった場合には{false, "%d"}と言う構造体で作ったペアが買える。
あとは、桁数判定のティップス。桁数数えるのが面倒なんで、一旦数値を文字列に直しちゃう。その文字列の「長さ」が桁数に一致する。
それを利用して、検索関数からハメたい文字列を持ってきて、ってやれば条件分岐は避けられます。
No.4 さん
構造体を利用、なるほど…
・for文のiを利用して改行…確かにそちらの方がスマートな感じですね!
・数値を一旦文字列に直したりすると色々便利になるんですね。
今回の場合それで条件分岐を避けられる、と。
・関数名の衝突は確かに避けなければいけませんね、失念しておりました。
次回以降気を付けます( ..)φメモメモ
ご丁寧な説明ありがとうございます!
じっくり読んで今後の参考にさせていただきます…!
No.3
- 回答日時:
そういう関数を作ればよいのではないでしょうか
/////////////////////////////////////////////////////////////
#include <stdio.h>
#include <math.h>
void printdigit(int value, int max){
for(int i = pow(10, max-1); i != 0; i = (i/10)){
if(value > i){
int digit = (value / i) % 10;
printf("%d", digit);
}else{
printf(" ");
}
}
}
int getdigit(int value){
for(int i = 1; ; i++){
value = (value/10);
if(value == 0) { return i; }
}
}
int main(void){
int input = 123456;
int value = 123;
printdigit(value, getdigit(input));
}
No.3 さん
pow()と除算を利用、なるほど…
この手法は自分ではとても思いつきませんでした。
参考にさせていただきます(*´▽`*)
No.1
- 回答日時:
ネタ的には面白そうなんだけど、この場合は書いたコードが全部あった方がいいかも。
あと、多分その分岐処理じゃ上手く行かないんじゃないかしらん。
例えば6桁の数値があった時点で、最初の条件節が処理されちゃって上手く行かないんじゃない?
条件を逆に99999から初めて小さくしていくべきなんじゃないか、って思う。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAのifで 4 2023/05/16 14:21
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) 【再々投稿】VBAのプログラムで動作しなくて困っています 8 2022/10/14 09:06
- Java Java 南京錠 2 2023/02/04 11:46
- Excel(エクセル) SUMIFのIF分岐について 4 2023/04/15 12:57
- その他(プログラミング・Web制作) プログラミング 処理速度 1 2022/11/25 11:05
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- その他(プログラミング・Web制作) Pythonを用いたフラッシュ暗算ソフトの開発に必要なもの 2 2023/01/29 02:22
- Visual Basic(VBA) VBAのトグルボタンでのマクロについて質問です 3 2022/10/10 17:23
- Excel(エクセル) Excel 特定セルの数値を参照したセルの0表示が空白にならないのはどうしてか? 3 2022/04/28 22:23
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・昔のあなたへのアドバイス
- ・字面がカッコいい英単語
- ・許せない心理テスト
- ・歩いた自慢大会
- ・「I love you」 をかっこよく翻訳してみてください
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・はじめての旅行はどこに行きましたか?
- ・準・究極の選択
- ・この人頭いいなと思ったエピソード
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
【Excel】特定の文字を含むセル...
-
VBAでループ内で使う変数名を可...
-
Loadイベント中にほかのイベン...
-
EXCEL VBA マクロ 実行する度に...
-
リョウ・・・量?料?
-
メルカリのメルカードで買い物...
-
wshで起動したコマンドををタイ...
-
DoEventsがやはり分からない
-
VB.NET Excelを読み込んでDataT...
-
月度は何て読みますか?
-
VBAでセルに値が入力されるまで...
-
vbaでieのプロキシ設定を変更す...
-
取り消し線が入った文字を削除...
-
VB.NET DataGridViewでIsNewRo...
-
生活保護受給者は性欲をどんな...
-
switch の範囲指定
-
50代の男性の方に
-
Access 日付/時間型を検...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
VBAでループ内で使う変数名を可...
-
【Excel】特定の文字を含むセル...
-
DoEventsがやはり分からない
-
UMLでの例外処理
-
EXCEL VBA マクロ 実行する度に...
-
switch の範囲指定
-
VBの質問#if 0 then ってどう...
-
月度は何て読みますか?
-
お家デートをしててハグを長い...
-
セックスレスの既婚女性は自慰...
-
インタラクティブの反対語は?
-
Loadイベント中にほかのイベン...
-
Do~Loopした回数をカウントしたい
-
findは動くがfindnextがマクロ...
-
VBAでセルに値が入力されるまで...
-
FFTの結果ついて
-
リョウ・・・量?料?
-
取り消し線が入った文字を削除...
おすすめ情報
追記:アドバイスに沿ってソースコードを貼り付けます。
OS:Windows10、 ソフト:VScode
途中で穴に気づいた為修正しております。
「入力された最小値、最大値、個数に基づいて乱数を出力」
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int random(int max, int min){
return (rand()%(max-min))+min;
}
int main(void){
int min; /*乱数の最小値*/
int max; /*乱数の最大値*/
int number; /*乱数の個数*/
int x=0; /*カウント用変数*/
printf("min > "); scanf("%d",&min);
↓文字数オーバーの為次に続きます…
printf("max > "); scanf("%d",&max);
printf("number > "); scanf("%d",&number);
if(min>=max){
print("error\n");
}
srand((int)time(NULL)); /*乱数リセット*/
for(int i=0;i<number;i++){
if(x==10) printf("\n"); /*10個ごとに改行*/
if(max<10) printf("%2d",random(max,min));
if(max>9 && max<100) printf("%3d",random(max,min));
↓続きます…2
if(max>99 && max<1000) printf("%4d",random(max,min));
if(max>999 && max<10000) printf("%5d",random(max,min));
if(max>9999 && max<100000) printf("%6d",random(max,min));
if(max>99999 && max<100000) printf("%7d",random(max,min));
if(max>999999) printf("%d ",random(max,min));
x++;
}
return 0;
}
読みづらいコードですみません…
すみません、if(){ printf("error")}のところは exit(0) が抜けてます…
改行していたのですが、それも無くなってしまってます…(なんでだろ)
駄文ですみません…