• ベストアンサー

int型をchar型に(右詰で)代入したい

皆様いつもお世話になってマス(^^; 今回はint型の整数をchar型に(右詰で)入れる方法について int counter = 100; char input_kaisuu[10]; counter++; ↑今カウンターは101です。 これを「input_kaisuu」に右詰で設定したいのです。 "0000000101"←結果としてこんなかんじに。 ------------------------------------------------- ちなみにこんなことをやってみました。 sprintf(input_kaisuu, "%d", counter); このやり方だと左詰で"1010000000"というようになってしまい、 全然違う数になってしまいました。(^^; 他にいい方法があれば教えてください!

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

%d を %09d にすると、お望みのものが出せます。 10進数で、9桁で表示する。表示する数字が9桁以下のときは先頭に0を表示する。 といった意味です。 10桁入れたいときは、char input_kaisuu[11] としてくださいね。 #文字列の終わりを表す文字も入れなきゃいけないので

techtak
質問者

お礼

回答ありがとうございました。 今まで出力用書式フラグの事を知らずにいました。 結果 char input_kaisuu[11]として、 %010dとすることで、解決できました。

techtak
質問者

補足

なるほど! では、「10進数で、10桁で表示する。表示する数字が10桁以下のときは先頭に0を表示する。」 としたい時は、%010d とすれば良いのですか?

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • ranx
  • ベストアンサー率24% (357/1463)
回答No.4

「回答」はcherry moonさんとnaturalさんにおまかせして、質問の文章の中に、恐らく techtakさんが誤解されていると思われる個所がありますので、注意を喚起しておきます。 > sprintf(input_kaisuu, "%d", counter); > このやり方だと左詰で"1010000000"というようになってしまい とはならないはずです。(ライブラリがバグっていない限り) この場合、配列の1番目から3番目(添字の0~2)に"101"が入り、4番目に'\0'が入ります。 '0'と'\0'は同じではありません。後者はゼロですが、前者は48という値(16進数で30) で'0'という文字を表します。また、配列の5番目から最後までに入る値は定義されていません。 親切な実装ならゼロを入れてくれるかもしれませんが、一般的には、前に使った時のゴミが 入っている場合が多いです。今回は、多分、最初なのでゼロ('0'ではなく'\0')が入って いたのだと思います。

techtak
質問者

お礼

ご指摘の通りです。 16進で確認したところ101の後ろにはNULL文字が入っていました。 不適切な質問で正確な回答は返ってきませんよね。 次回からは問題を正確に把握してから質問したいとおもいます。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • natural
  • ベストアンサー率37% (419/1115)
回答No.3

ありゃ、回答がダブってしまいました。 回答欄を開いたときは0件だったんですが…。(^_^; お詫びに補足を。 sprintf(input_kaisuu, "10%d", counter); とすると、0埋め無しで右詰になりますよ。(^_^) (勿論この場合も'\0'分の領域は用意して下さいね)

techtak
質問者

お礼

補足ありがとうございます。(^^;

全文を見る
すると、全ての回答が全文表示されます。
  • natural
  • ベストアンサー率37% (419/1115)
回答No.2

sprintf(input_kaisuu, "010%d", counter); では如何でしょうか。 但しinput_kaisuuは'\0'分も含めて11以上の配列にして下さいね。(^_^)

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • char型+char型ってint型? if(char型==int型)?

    C言語の「汎整数拡張(インテグラルプロモーション)」というものに関するものだと思います。 char型とchar型を加えた結果は、char型でしょうか。それともint型でしょうか。 (下のプログラムの printf("sizeof(a[0]+a[1])は%d\n", sizeof(a[0]+a[1])); /* char型+char型 */ という部分の結果は4なので、int型と考えるべきなのかな。) 私は、char型とint型の加算の結果はint型だと思っていましたが、 char型とchar型の加算の結果はやはりchar型だと思っていました。 (それが間違えているのでしょうか。) if(a[0]==i) /* char型とint型の比較(?) */ の部分では、左辺はchar型、右辺はint型ですが、このように型の違う変数を比較しても文法上構わないのでしょうか。 (私は、「比較は必ず型の同じもの同士でしかできない」と思っていました。) 左辺はchar型のように見えて、じつはint型ですか。 #include <stdio.h> int main(void) { char a[4]; int i=77; printf("sizeof(int)は%d\n", sizeof(int)); printf("sizeof(char)は%d\n", sizeof(char)); printf("sizeof('M')は%d\n", sizeof('M')); printf("sizeof(a[0])は%d\n", sizeof(a[0])); a[0]='M'; a[1]=7+6; a[2]=a[0]+a[1]; printf("sizeof(a[0]+a[1])は%d\n", sizeof(a[0]+a[1])); /* char型+char型 */ printf("sizeof(+a[0])=%d\n", sizeof(+a[0])); if(a[0]==i) /* char型とint型の比較(?) */ puts("a[0]==i"); else puts("a[0]!=i"); return(0); } ちなみにワーニングもエラーもなんにもでません。

  • char型の扱える範囲とは?

    整数をchar型にしたいと思い int a = 250; char b[1]; sprintf(b, %d, a); と書いたのですが, char型の扱える整数の範囲である-256~255のint型の整数しか char型にこの場合変換できないということでいいでしょうか? またint型に代入できる値は,32bit以内の整数という考えでいいですか?

  • charの操作について

    お世話になります、フジと申します。 今回皆様にお聞きしたいことはchar型変数の操作についてなのですが、次のプログラムのようにchar型に代入した整数を16進数用に変換させ、最後に同じchar型の変数に代入したいと考えています。 int a,b,c; char data = 48; //dataに10進数48を代入 c = (int)data; //ここでcは48になる a = c/16;          //16進数用に変換 b = c%16; c = 10*a + b;        //ここでcは30になる このint型変数c(30)をchar型変数dataに代入するにはどうしたらいいでしょうか? char buf[5]; sprintf(buf,"%d",c); にすればchar型の配列に代入することは出来ますが、これだとcの値30がbuf[0]=3,buf[1]=0となってしまい、目的の操作が達成できません。 よい方法をしっている方がいましたら、宜しくお願い致します。

  • int型変数をchar型変数に格納する方法

    int型数値をchar型変数に格納したいのですが、 sprintf()とatoi()を用いてやりましたが、 うまくいきません。 考えたコードを下記します。 int get_y(){ int y=2005; return y; } int main(){ char year; char str[5]; //intをcharに変換して格納している sprintf(str,"%d",get_y()); //数値として代入 year=atoi(str); //yearには2005が格納されていない! cout<<year<<endl; char ans; //このchar型変数に数値を代入する。 ans=year; cout<<ans<<endl; return 0; } お手数をお掛けしますが、 よろしくお願い致します。

  • c言語 int型の数字をchar型の配列に

    c言語についてです。 int型の数字をchar型の配列に入れたいです。 関数に対してint型の数字を文字列として渡し、 関数内でchar型の配列に格納したいです。 例として、 a(char a[]){  ~~  ~~ } int main(void){ int x = 5678;  ~~  a(x); } とできるようにしたいです。 しかしこれだと5678という値がそのままchar型の一つの配列に入る?ため正しくないです。 欲しい結果としてはちゃんとa関数内で、 a[1] = '5' a[2] = '6' a[3] = '7' a[4] = '8' となってほしいです。 もともと渡す値が”5678”となっていれば結果は正しく出るのですが、 渡す値がint型と決まっているためどうにかして5678を”5678”とすればいいのではないかと考えています。 つまり5678を単純に文字列に変換すればいいのでしょうか? またプログラム内ではsprintfやatolを使用しないで実現させたいです。 難しいかもしれませんがお願いします。 なんだか説明が下手ですみません。 お願いいたします。

  • c言語でint配列をdoubleに変換

    c言語でマイコンプログラムを作成しています. int型の配列をdoubleに変換するために以下のプログラムを記述し,テストしました. int a[4] = {0,0,1,8}; char s[4]; double d; char *temp; sprintf(s,"%d%d%d%d",a[0],a[1],a[2],a[3]); //文字列charをdoubleに変換 d = strtod(s,&temp); 望む結果は 18 ですが,なぜか上記結果は 1800 となりました. 試しに int a[4] = {1,2,3,4}; と,1234と表示されました. 上記より,出力値が左詰めのようになっています. 試しにVisual Studio 2013 C++で同様のプログラムを実行すると,所望の結果を得ることが出来ました. プログラムがおかしいのでしょうか?それともマイコンのコンパイラのバグでしょうか? お分かりになられる方がいらっしゃいましたら,ご教授宜しくお願い致します.

  • アドレスをintに代入する方法

    適当なアドレスをprintfで表示し、その値をintに代入するのが目的です。 #include <iostream> using namespace std; main(){ char buf[20]; char **pp; char *p = "\0"; int i; pp = &p; printf("%lu\n", pp); sprintf(buf, "%lu\n", pp); i = atoi(buf); printf("%lu\n", i); } とりあえずできていますが、 pp = &p;以降の処理で、bufを使ったり非推奨?のatoi()を使っています。 pp = &p;以降の処理でもっとよい方法はないでしょうか?

  • アドレスをint変数に代入する方法

    printfで表示したアドレス値を、int変数に代入するのが目的です。 #include <iostream> using namespace std; main(){ char buf[20]; char *(*pp)[2]; char *p[2]; int i; pp = &p; printf("%lu\n", pp); // i = (int)(&pp); sprintf(buf, "%lu\n", pp);//// i = atoi(buf);//// printf("%lu\n", i); } とりあえずできていますが、 pp = &p;以降の処理で、bufを使ったり非推奨?のatoi()を使っています。 pp = &p;以降の処理でもっとよい方法はないでしょうか? また、このソースは不正なことをやっていないでしょうか? 必要な初期化をやってない、などということはありませんか?

  • 文字を整数(int)に変換

    char型の数字文字を、int型に変換したいのですが、どんな方法があるでしょうか? 具体的には、 char s[6] = "12345"; int line[5]; のようなchar配列の文字を、int型のline配列に移したいのです。(line[0]=1,line[1]=2,...,line[4]=5となるように。) "文字 int 変換"などで検索でも調べたのですが、 int→文字のsprintfしか見つかりませんでした。 感覚的にはこの逆のような操作をしたいです。 何か関数を用いる方法でも、そうでない方法でもよいので、 教えてください。よろしくお願いします。

  • char型とint型セットの配列

    Cのプログラミングの課題をやっているのですが、初心者で自分では解決できそうになく、投稿させていただきました。 Make Fiveというゲームをもとにした課題で、アルファベット一文字と数字(250までの整数)を25セットユーザーに入力してもらった後(例:s10 e3 c6)、5x5のマス目のどこにカードを入力したいかを順次決めてもらいます。 すべてのマス目が埋まったのち、縦、横からアルファベットを読んでいき、意味のある文字になっていればアルファベットとセットになっている数字の合計が得点になります (例:y1, o2, u3 と横にカードが続いていればyouという単語になるので 1+2+3=6点)。 今、つまずいているのは、最初のカードの入力のところです。 最初は構造体を使うのだろうと思い下記のようなコードをかいたのですがうまくいきません (いじっているうちにさらに変になってしまったようです…。) 最初は isNum isAlphとかの条件をいれずに書き、そのときは アルファベットと数字をスペースをあけて入力すると(例:q 1)うまくいきましたが、スペースなしで入力すると 数字も文字扱いされてしまいうまくいきません。getcharとかsprintfを使うのかもとも思い、いろいろ調べてみたのですが、どうもよくわかりません。 今は、isNumとかの条件をいれたせいでコンパイルもできなくなってしまいました…。どのような感じでプログラムをしていけばいいのでしょうか?長文で申し訳ありませんが、よろしくお願いします。 // Boolean constants #define TRUE 1 #define FALSE 0 #define MAXCARD 25 #define MAXROW 5 #define MAXCOLUMN 5 typedef char strAlph[1]; typedef int intNum; struct tCard{ intNum scoreNum; strAlph alph; }; struct tPlaceCard{ struct tCard; intNum cardRow; intNum cardCol; }; int main(int argc, char **argv){ int i=0, j=0; struct tCard eachCard[MAXCARD]; int table[MAXROW][MAXCOLUMN]; int row=0, col=0; int isNum=FALSE; int isAlph=FALSE; //Obtain cards printf("Enter 25 cards and their values: "); for(i = 0; (i < MAXCARD && isNum==FALSE && isAlph==FALSE); i++){ if(scanf("%s %d",eachCard[i].alph,&eachCard[i].scoreNum)==2){ if((*eachCard[i].alph >= '0')&&(*eachCard[i].alph <= '9')){ printf("Input Error\n"); isNum=TRUE; }else if((eachCard[i].scoreNum<='0')&&(eachCard[i].scoreNum>='9')){ printf("Input Error\n"); isAlph=TRUE; } }

資格で食っていく生き方
このQ&Aのポイント
  • 知人、42歳、造船所で設計部スタッフをやっていましたが、近々その造船所が新造船事業から撤退するということで、問答無用で失職する200人くらいの一人になってしまいました。次どうするのか?と聞いたら、「社労士の資格を取る」とのことでした。思うのですが、「資格を取って、その仕事をする」というのは、そんなに安定した生き方なのでしょうか?
  • 社労士なら社労士がイヤになったら、また他の事を探すというのは大変ですよね。ましてこの知人みたく、「〇〇の仕事がイヤになったから」という理由で、設計エンジニアが社労士って、どうなんだろう?「楽しくない」というのは、リスクのうちには含まれないのかなあ?と私なんかは思います。設計が好きで大学卒業してこれまで仕事してきたんだから、船がイヤならよその造船所の船、機械、プラント、自動車部品・・・それを選ばない理由が、「社労士は資格さえ取ってしまえば安心だから」というのは、ぱっと聞いて人が納得する理由になるのでしょうか?
  • *最近ニューヨークの弁護士資格試験にお落ちになった某花婿は、その前は法学部卒でもなく、銀行員でしたよね。特段法律学に魅せられてそうなったとはとても思えなくて、やっぱり「資格なら安心」と思ってそうなったのかなあ?とは思います。
回答を見る

専門家に質問してみよう