Skip to main content

第2回 4桁の入力を文字列で扱おう

🔤 第2回 4桁の入力を文字列で扱おう

今回は、プレイヤーが入力する4桁を、どのような変数へ保存すればよいか考えます。


1.まずは整数として入力してみる

「4桁の数字を入力する」と聞くと、最初はint型を使いたくなります。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)
{
    int number;

    printf("4桁の整数を入力してください:");
    scanf("%d", &number);

    printf("入力された数は:%d\n", number);
    return 0;
}

このプログラムには、HIT&BLOWの入力処理として困る点があります。

  • 3桁以下でも入力できる
  • 5桁以上でも入力できる
  • 0123を入力すると123として扱われる

なぜ0123123になるのか

整数の値には、「先頭に0が付いていた」という情報が残りません。

0123を整数として入力
        ↓
整数の123として保存

HIT&BLOWでは、0から始まる問題も4桁として扱いたいため、整数型では都合がよくありません。


2.見た目が数字でも、文字として保存する

今回は、入力された内容を文字列として受け取ります。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main(void)
{
    char input[255] = "";

    printf("4桁の数字を入力してください:");
    scanf("%254s", input);

    if (strlen(input) == 4)
    {
        printf("入力された数字は:%s\n", input);
    }
    else
    {
        printf("4桁ではありません。\n");
    }

    return 0;
}

3.ここでC言語:char型の配列

char input[255];

これは、char型の変数を255個並べた配列です。

文字列を入力すると、1文字ずつ配列へ入ります。

例えば、0123を入力した場合は、次のようになります。

添え字       0     1     2     3     4
配列の中身  '0'   '1'   '2'   '3'   '\0'

C言語の文字列の最後には、終端文字\0が入ります。

\0は、「ここで文字列が終わる」という印です。

💡 4文字を保存するだけでも、配列は最低5要素必要です。
4文字に加えて、終端文字\0を保存する場所が必要だからです。

char number[5];

4.数字の0と文字の'0'は違う

次の2つは、同じものではありません。

0
'0'
  • 0は整数
  • '0'は文字

文字はシングルクォーテーションで囲みます。

char c = '0';

HIT&BLOWでは、各桁を次のような文字として比較します。

if (input[0] == '0')
{
    printf("1桁目は0です。\n");
}

⚠️ input[0] == 0では、文字の'0'と比較したことになりません。


5.配列の添え字が桁位置になる

入力:0123
配列の要素 意味 保存されている文字
input[0] 1桁目 '0'
input[1] 2桁目 '1'
input[2] 3桁目 '2'
input[3] 4桁目 '3'

この仕組みを使うと、次の2つを同時に扱えます。

  • 配列の添え字:数字がある位置
  • 配列の中身:その位置にある数字の文字

この2つを正解と比較すれば、HITとBLOWを判定できます。


6.ここでC言語:strlen

strlenは、文字列の長さを調べる関数です。

使用するには、次のヘッダーファイルが必要です。

#include <string.h>
strlen(input)

0123が保存されている場合、戻り値は4です。

終端文字\0は文字数に含まれません。

'0' '1' '2' '3' '\0'
 └──── 4文字 ────┘

7.%254sの254は何か

char input[255];
scanf("%254s", input);

%254sは、最大254文字まで読み込む指定です。

配列の要素数は255ですが、最後の1要素は終端文字\0のために残します。

入力できる文字:最大254文字
終端文字      :1文字
合計          :255要素

⚠️ %sだけで文字数を指定しないと、配列より長い入力によって範囲外へ書き込む危険があります。


8.実際に試してみよう

次の入力を試し、表示がどう変わるか確認してください。

1234
0123
123
12345
abcd

この段階では、文字数が4かどうかだけを確認しています。

abcdも4文字なので通ってしまいます。数字以外の文字や数字の重複は、後の回で確認します。


🏁 今回のまとめ

  • 0123を整数として保存すると123になる
  • HIT&BLOWの入力は文字列として扱う
  • C言語の文字列はchar型の配列
  • 文字列の最後には終端文字\0が入る
  • 配列の添え字を使うと、各桁を1文字ずつ扱える
  • strlenで文字列の長さを調べられる
  • %254sのように最大入力文字数を指定する

次回は、0~9をシャッフルして、重複しない4桁の問題を作ります。