第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として扱われる
なぜ0123が123になるのか
整数の値には、「先頭に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桁の問題を作ります。