【第1部】C言語(K&R検証)編
0021.整数を文字列にする
ソース紹介
これまで
atoi()関数(文字列から数字への変換)は何度か出てきましたが、今回のは
整数から文字列への変換です。
CPPファイルに記述
#include <iostream>
#include <cstdio>
using namespace std;
/*
文字列sを逆順にする
*/
void reverse(char s[]) {
for (int i = 0, j = (int)strlen(s) - 1; i < j; i++, j--) {
char c = s[i];
s[i] = s[j];
s[j] = c;
}
}
/*
nをs中の数字文字列に変換する
*/
void itoa(int n, char s[]) {
int i, sign;
if ((sign = n) < 0) {
//マイナスの場合はnを正にする
n = -n;
}
i = 0;
//数字を逆順に生成する
do {
//次の桁をとってくる
s[i++] = n % 10 + '0';
} while ((n /= 10) > 0); //その桁を削除
if (sign < 0) {
s[i++] = '-';
}
s[i] = '\0';
reverse(s);
}
/*
itoaのテスト
*/
int main()
{
//大きめにバッファを用意する
char str[100];
itoa(123, str);
cout << str << endl;
itoa(-4567, str);
cout << str << endl;
itoa(0, str);
cout << str << endl;
return 0;
}
出力
サンプル説明
ここでは前項で使用した
reverse()関数が使われています。
itoa()関数は
一度は通ってほしいループを使用します。すなわち
do-whileループです。
whileやforだと、条件によっては
一度も通らない場合があります。
itoa()関数の場合は
必ず整数が渡されることは決まっているので、
1度は必ず処理するほうが実装しやすいわけです。
C++で記述する場合
coutがすでに
itoa()関数の機能を持っています。
ソース紹介
CPPファイルに記述
#include <iostream>
#include <cstdio>
using namespace std;
/*
coutのテスト
*/
int main()
{
cout << 123 << endl;
cout << -4567 << endl;
cout << 0 << endl;
return 0;
}
しかし
出力する場合以外もあると思います。例えば
intを
stringに変換する場合は
ソース紹介
CPPファイルに記述
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
/*
to_stringのテスト
*/
int main()
{
string str = to_string(123);
cout << str << endl;
str = to_string(-4567);
cout << str << endl;
str = to_string(0);
cout << str << endl;
return 0;
}
のように
to_string()を使えます。この例では
strを
coutしてますが、出力せずに内部処理に使うことも可能です。
K&Rでの記述
元になったのは
第3章:制御の流れに記述されています。
ループ(do-while)の説明のところです。