現在行われているPaizaオンラインハッカソンVol.6で昨日まで1個ずつC++を選択した場合の回答例を上げたが、今回はPaizaオンラインハッカソンVol.6に参加してみた(緑川つばめミッション, C++)をC言語で記述したらどうなるのかを書いてみた。C言語ではC++と比較するとライブラリー面で貧弱であるため、若干難儀した。
回答例
[code lang=”c”]#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void){
// 文字列を入力する
const size_t charSize = 100;
char str[charSize];
fgets(str, charSize, stdin);
// 改行コードを除去する(のちの処理で問題となるため)
if (strchr(str, ‘\n’) != NULL) {
str[strlen(str) – 1] = ‘\0’;
}
// 数値が10〜99の場合は異常終了させる
int num = atoi(str);
const int min = 10;
const int max = 99;
if (num < min || max < num) {
return EXIT_FAILURE;
}
// 桁の長さを取得して、それぞれの桁の数値を加算させる
// それぞれの数字は文字であるため、数値にするための処理が必要
int len = strlen(str);
char zero = ‘0’;
for (int idx = 0; idx < len; idx++) {
num += str[idx] – zero;
}
// 合計値を出力する
printf("%d", num);
return EXIT_SUCCESS;
}[/code]
解説
C++ではgetlineという関数があり、こちらは改行コードを自動的に認識して除去してくれたが、C言語ではそれがないため、代替としてfgets関数を使わなければならない。fgets関数では取得先の文字列、文字列の長さの限界値、取得元を指定することで取得先の文字列に文字列が格納される。今回はそれほど長い文字数になるわけではないため、文字列の長さは100とした。
なお、この文字列は改行コードが加えられているため、改行コードをNULL文字に置き換えなければならない。これはstrlenで得られた長さ-1の文字を\0に置き換えることでNULL文字にすることができる。
また、C言語ではstoi関数はないので、atoi関数を使う。これはASCII to integerという意味である ((C++のstoiはString to integerである)) 。また、10〜99以外の数値が入力された場合は異常終了させるようにした。
その後、それぞれの桁の数値を加算させる。文字としての数字と数値は別物である ((文字列としての0はASCII及びUTF-8ではそのまま数値にしてしまうと48になってしまう)) ため、必ずそれを吸収しなければならない。また、C++ ((C++11以降)) では範囲ベースのforループが使えたが、C言語では使えないため、改行コードを削った後の文字列を取得してから、その長さをもとにforループを回して、加算する。
そして、printf関数で出力して終わりである。
結果
cf: https://paiza.jp/poh/joshibato/tsubame/result/8844ffb1
全テストケース通過、処理時間は0.01秒だった。
最後に
今回はC言語を使った場合で説明を行った。C++で使えたものが使えなくなっているが、どうすれば同一の価値の処理を行えるのか考えると良いだろう。
ウェブマスター。本ブログでITを中心にいろいろな情報や意見などを提供しています。主にスマートフォン向けアプリやウェブアプリの開発を携わっています。ご用の方はコメントかコンタクトフォームにて。