入力された文字・文字列から何回数字が登場したかカウントするプログラムの書き方を解説します。
サンプルコード
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main() {
char buffer[BUFSIZ];
scanf("%s", buffer);
int count = 0;
for (int i = 0; i < sizeof(buffer); i++) {
if (buffer[i] == NULL)break;
if (buffer[i] >= '0' && buffer[i] <= '9') {
count++;
}
}
printf("数字の登場回数:%d", count);
return 0;
}
解説
重要なポイントは7行目~14行目までのforループです。
8行目のNULL
判定は大切です。scanf関数
で受け取った入力文字列などの文字列の終端は必ずNULL
になっています。
そのため、文字列の文字を一つ一つチェックしていく際にNULL
が登場したということは、そこが文字列の終端であるということを判定できます。
文字列の終端まで到達したということはそれ以上ループを回す必要がないため、break文
でforループを抜ける処理をループの最初に行っています。
10行目のif文では、文字が数字かどうか判定しています。
ここで重要なポイントは数値としての0~9ではなく文字としての0~9で判定を行っているということです。
C言語は都合よく勝手に0~9の数字に変換されることがないので、必ず文字としての0~9で判定を行う必要があります。
また、C言語の文字は文字コードという数値で管理されており、文字の0~9までは全て連番になっています。
文字 | 文字コード |
---|---|
0 | 48 |
1 | 49 |
2 | 50 |
3 | 51 |
4 | 52 |
5 | 53 |
6 | 54 |
7 | 55 |
8 | 56 |
9 | 57 |
つまり、buffer[i] >= '0' && buffer[i] <= '9'
はbuffer[i] >= 48 && buffer[i] <= 57
と同じ意味であり、たった2つの条件で0~9の数字かどうか判定できるのです。
わざわざbuffer[i] == '0' || buffer[i] == '1' || buffer[i] == '2' ||...
のように長々と書く必要はありません。
あとは、条件に一致したとき(数字だったとき)にカウントしていくだけです。
さいごに
今回の例では、文字列中に登場する数字をカウントするプログラムの紹介でしたが、カウント条件を変更すればアルファベットの出現回数・特定の記号の出現回数を判定することも可能です。