【第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;
}
出力
サンプル説明
このサンプルは
足し算を実装してます。
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()関数で変換します。
しかし
数字以外が入力されたときのために
エラー処理が必要です。ここでは
例外処理を実装しています。
以下に、実行例をいくつか紹介します。
上記は成功例ですね。
上記は失敗例です。数字以外の行が入ってます。
上記は成功してます。
12363+254が計算されています。
上記は失敗ですね。数字の前に
数字以外が入ってます。
プラスマイナス符号に対応してるのがわかります。
これらのことから
cinによる
intへの代入は、
先頭から数字が続く限りcinが何とかしてくれると考えられます。
まあ、本当は、cinに直接入れないで、いったん
stringに入れて
すべての文字が数字かどうかを検証してから、
istringstreamクラスを使うか、あるいは
atoi()を使うかですか。
K&Rでの記述
元になったのは
第2章:データ型・演算子・式に記述されています。
型変換の説明のところです。