PaizaオンラインハッカソンVol.6に参加してみた(緑川つばめミッション, C言語)

この記事は1年以上前に掲載されたものです。 情報が古い場合がありますのでお気を付け下さい。

現在行われている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という意味である1 。また、10〜99以外の数値が入力された場合は異常終了させるようにした。

その後、それぞれの桁の数値を加算させる。文字としての数字と数値は別物である2 ため、必ずそれを吸収しなければならない。また、C++3 では範囲ベースのforループが使えたが、C言語では使えないため、改行コードを削った後の文字列を取得してから、その長さをもとにforループを回して、加算する。

そして、printf関数で出力して終わりである。

結果

cf: https://paiza.jp/poh/joshibato/tsubame/result/8844ffb1

全テストケース通過、処理時間は0.01秒だった。

最後に

今回はC言語を使った場合で説明を行った。C++で使えたものが使えなくなっているが、どうすれば同一の価値の処理を行えるのか考えると良いだろう。

ウェブマスター。本ブログでITを中心にいろいろな情報や意見などを提供しています。ご用の方はコメントかコンタクトフォームにて。
  1. C++のstoiはString to integerである []
  2. 文字列としての0はASCII及びUTF-8ではそのまま数値にしてしまうと48になってしまう []
  3. C++11以降 []