C++サンプル集

【第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;
}
出力
123
-4567
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;
}
 しかし出力する場合以外もあると思います。例えばintstringに変換する場合は

ソース紹介

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()を使えます。この例ではstrcoutしてますが、出力せずに内部処理に使うことも可能です。

K&Rでの記述

 元になったのは第3章:制御の流れに記述されています。ループ(do-while)の説明のところです。