int型として入力された二桁の数字を文字列に変換したいです。
具体的には、例えば「18」という数字を「"18"」という文字列に変換させたいと考えています。
どのような操作を行えば二桁の数字を文字列に変換することができるでしょうか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答5件
0
んでは別回答を
int value=13;
char bf[3];
bf[0]=((value/10)%10)+'0';
bf[1]=(value%10)+'0';
bf[2]='\0';
投稿2019/04/17 07:20
総合スコア88163
0
ベストアンサー
c
1#include <stdio.h> 2 3int value = 18; 4char output[3]; /* 2桁+終端 = 3文字 */ 5snprintf(output, 3, "%d", value);
投稿2019/04/17 03:53
編集2019/04/17 06:53総合スコア6191
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
基本的には他の回答者の方々が答えたような操作をします。補足を加えて説明します。
まず、「二桁の数字」と言ったら文字列です。int型は単なる数値なので桁数はないです。
問題を考えるときに、「入力された数値は必ず二桁で表せるような値になっている」ということを暗黙に仮定してしまっていませんか。int型はもっと広い範囲の値を表せます。数値を入力するためのコードで、値の範囲を検査して妥当なものだけ受け付けているとは限りませんよね。入力された値が妥当かどうかを検査しましょう。
そこで、ご質問の要件を「入力されたint型の数値が二桁の数字で表せるときは文字列に変換する」と解釈することにしました。こんなコードでしょう。
c
1#include <stdio.h> 2 3int val = 99; 4char buf[3]; 5 6... 7 8 if (10 <= val && val <= 99) 9 snprintf(buf, sizeof buf, "%d", val); 10 else 11 エラー処理; 12 13...
「エラー処理」のところは自分で考えて下さい。
配列bufのサイズは、ほかの回答者さんたちも書いていらっしゃる通り、「数字の桁数」プラス「文字列終端の '\0'」の分だけ必要です。Pythonなどの「高級」な言語とちがって、Cではデータの中身がメモリ上でどう表現されているかをいちいち気にして、必要な大きさのメモリ領域を明示的に確保しなければなりません (Pythonでの文字列はメモリ上でもっと複雑な仕組みで表現されていますが、プログラミングの際はそんなことを気にしなくていいし、必要なメモリ領域も自動的に確保してくれます)。
数値を文字列に変換して配列に書き込む方法ですが、すでにC標準ライブラリにそういう関数がありますから、再発明することもないでしょう。それを使いました。
しかし、配列の大きさは今回の目的に必要な最小限の3バイトしか確保してありませんから、結果の文字列の長さは絶対に2バイトを超えないようにしなければなりません (1バイト少なくなるのは、文字列終端の '\0' で1バイト使うため)。
sprintf
などを使った場合、万一確保した長さを超えてもお構いなく配列のために確保したメモリの外にまで書き込んでしまいます (「バッファオーバーラン」といって、システムの脆弱性につながる危険な動作です)。snprintf
を使うと、指定した長さ以上は書き込まないことが保証されます。今回はそういうことは起きないかもしれませんが、今後プログラムを修正していくとそういうコードになってしまうかもしれません。こちらを使います。
それぞれの関数の詳しい説明は自分で調べて下さい。
回答は以上……なのですが、ひとつ気づいたことがあります。入力される数値はint型、つまり符号つき整数ですよね。
そこでちょっとまわりの人に聞いてみたところ、「-10」なんかも「二桁の数字」だと言っています……。負の数も受け付けるようにしたほうがよさそうです。
また、±9 以内の数も、二桁で入力できると言えば言えるので、受け付けてしまっていいように思います。ということでコードを修正しました。
c
1#include <stdio.h> 2 3int val = -99; 4char buf[4]; 5 6... 7 8 if (-99 <= val && val <= 99) 9 snprintf(buf, sizeof buf, "%d", val); 10 else 11 エラー処理; 12 13...
if
の条件が変わっただけではないです。buf
のサイズが変わりました。今度は結果に「-」がつくことがあるので、さらに1バイト必要です。もしもサイズが元のままだと、先に書いた通り、snprintf
関数は結果のはみ出る部分を切り捨てます。つまり「-10」であるべきものが「-1」になってしまいます。
snprintf
の呼び出しそのものは変わっていません。他の回答者には、変換の処理を自力で書いたかたもいらっしゃいます。Cでどのような処理をしているのかを理解するには非常によいのですが、今回のように要件が変更になったときには期待通りの結果を出せなくなるので、書き直しが必要になります。C標準ライブラリのsnprintf
関数はもともと負の数の変換にも対応していますから、そのまま使えます。
以上ですが、このような回答でよいでしょうか? (誰に聞いているのか)
投稿2019/04/22 13:23
総合スコア4443
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
c
1#include <stdio.h> 2#include <stdlib.h> 3 4int digits(int n); 5 6int main(void){ 7 8 int n = 18; 9 int i; 10 char output[3]; 11 int m = digits(n); 12 for(i = 0; i < m; i++){ 13 output[m - i - 1] = '0' + n % 10; 14 n /= 10; 15 } 16 output[2] = '\0'; 17 printf("%s",output); 18 return 0; 19} 20int digits(int n) 21{ 22 int digit = 0; 23 while(n > 0){ 24 n /= 10; 25 digit++; 26 } 27 return digit; 28}
投稿2019/04/17 08:46
編集2019/06/03 03:28
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/03 03:59

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。