C++サンプル集

【第1部】C言語(K&R検証)編

0010.足し算を実装する

ソース紹介

CPPファイルに記述
#include <iostream>
#include <string>
using namespace std;

/*
sを整数に変換する
*/
int atoi(char s[]) {
    int n = 0;
    for (int i = 0; s[i] >= '0' && s[i] <= '9'; ++i) {
        n = 10 * n + (s[i] - '0');
    }
    return n;
}

/*
足し算の実装
*/
int main()
{
    string leftstr;
    string rightstr;
    getline(cin, leftstr);
    getline(cin, rightstr);
    cout << atoi(leftstr.c_str()) + atoi(rightstr.c_str()) << endl;
    return 0;
}
出力
56789
76543
133332

サンプル説明

 このサンプルは足し算を実装してます。K&Rではこの説明にatoi()関数を紹介しています。
 atoi ASCII から Integer という意味です。つまり、ASCIIコードの数字の文字列整数に変換するのでこのような名前がついています。
 C/C++にはなんとかtoなんとかという名前の関数がいくつか存在します。atof()もそうですね。
 ちなみにLinuxコマンドにはps2pdfとかpdf2psとかもあります。これは to の部分を 2 に置き換えたもので、データ変換に使われることが多いです。
 atoi()関数を見ると、forの中に
        n = 10 * n + (s[i] - '0');
 と記述があります。10倍して1の位を追加してますね。これをfor数字が続くまで処理します。
 なるほどと思うと思います。
 さて、これをC++オンリーで書いた場合、以下の様に書けます。

ソース紹介

CPPファイルに記述
#include <iostream>
#include <string>
using namespace std;

/*
足し算の実装
*/
int main()
{
    try {
        string left, right;
        cin >> left;
        cin >> right;
        cout << stoi(left) + stoi(right) << endl;
    }
    catch (...) {
        cout << "数字以外が入力された" << endl;
        return -1;
    }
    return 0;
}
 この場合cinからstringで受けstoi()関数で変換します。
 しかし数字以外が入力されたときのためにエラー処理が必要です。ここでは例外処理を実装しています。
 以下に、実行例をいくつか紹介します。
56789
76543
133332
 上記は成功例ですね。
25648
abcde
数字以外が入力された
 上記は失敗例です。数字以外の行が入ってます。
12363
254aaa
12617
 上記は成功してます。12363+254が計算されています。
12345
abc456
数字以外が入力された
 上記は失敗ですね。数字の前に数字以外が入ってます。
+12345
-45678
-33333
 プラスマイナス符号に対応してるのがわかります。
 これらのことからcinによるintへの代入は、先頭から数字が続く限りcinが何とかしてくれると考えられます。
 まあ、本当は、cinに直接入れないで、いったんstringに入れてすべての文字が数字かどうかを検証してから、istringstreamクラスを使うか、あるいはatoi()を使うかですか。

K&Rでの記述

 元になったのは第2章:データ型・演算子・式に記述されています。型変換の説明のところです。