プログラム問題(1)
以下の問題のプログラムをやったのですが、コマンドプロンプトで実行してみるとエラーになってしまうのですが、どなたか問題点を指摘していただけないでしょうか?
【問題】
1 西暦1868年から2007年までの年号を入力して和暦に変更して出力するプログラムを作成するプログラム。
例 入力 1868 出力 明治元年
2007 平成19年
【自分でやったプログラム】
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#define streq(a, b) !strcmp((a), (b))
const char *get_era(int);
const char *get_era_name(int);
int get_era_year(int);
void test_get_era(void);
int
main(int argc, char *argv[])
{
int year;
char *endptr;
const char *era;
test_get_era();
if (argc < 2) {
fprintf(stderr, "引数を入力してください。\n");
exit(1);
}
year = (int) strtol(argv[1], &endptr, 0);
if (*endptr != '\0') {
fprintf(stderr, "数値を入力してください。\n");
exit(1);
}
era = get_era(year);
if (era == NULL) {
fprintf(stderr, "西暦を入力してください。(1868-2007)\n");
exit(1);
}
printf("%s\n", era);
return 0;
}
const char *
get_era(int year)
{
static char buf[256];
int era_year = get_era_year(year);
const char *era_name = get_era_name(year);
if (era_year == -1) {
return NULL;
}
if (era_year == 1) {
sprintf(buf, "%s%s", era_name, "元年");
} else {
sprintf(buf, "%s%d%s", era_name, era_year, "年");
}
return buf;
}
int
get_era_year(int year)
{
if (1868 <= year && year <= 1911) {
return year - 1867;
}
if (1912 <= year && year <= 1925) {
return year - 1911;
}
if (1926 <= year && year <= 1988) {
return year - 1925;
}
if (1989 <= year && year <= 2007) {
return year - 1988;
}
return -1;
}
const char *
get_era_name(int year)
{
if (1868 <= year && year <= 1911) {
return "明治";
}
if (1912 <= year && year <= 1925) {
return "大正";
}
if (1926 <= year && year <= 1988) {
return "昭和";
}
if (1989 <= year && year <= 2007) {
return "平成";
}
return NULL;
}
void
test_get_era(void)
{
/* 無効 */
assert(get_era(1867) == NULL);
assert(get_era(2008) == NULL);
/* 明治 */
assert(streq(get_era(1868), "明治元年"));
assert(streq(get_era(1869), "明治2年"));
assert(streq(get_era(1911), "明治44年"));
/* 大正 */
assert(streq(get_era(1912), "大正元年"));
assert(streq(get_era(1913), "大正2年"));
assert(streq(get_era(1925), "大正14年"));
/* 昭和 */
assert(streq(get_era(1926), "昭和元年"));
assert(streq(get_era(1927), "昭和2年"));
assert(streq(get_era(1988), "昭和63年"));
/* 平成 */
assert(streq(get_era(1989), "平成元年"));
assert(streq(get_era(1990), "平成2年"));
assert(streq(get_era(2007), "平成19年"));
}
お礼
分かり易い回答をありがとうございました。 なるほど、そのオブジェクト自身を変更するものではなく、変換したものを生成して返すだけの機能でしたか。 それを変数に代入するなり式に組み込むなりしないと意味がないと。 誤解が晴れてすっきりしました。