問題
『キーボードから入力した文字列も調べ、英小文字、英大文字、数字、その他の個数を表示する』
実行結果
『文字列=>aBc12D#$
英小文字=>2個 英大文字=>2個 数字=>2個 その他=>2個 』
はどのようにして作成すればよいでしょうか?
使用するのは stdio.h と string.h の2つです。
文字列の個数カウント
Re: 文字列の個数カウント
課題の丸投げは禁止です。
フォーラムルールを読み、従ってください。
特に、
・aojiruさんは何がわかっていて、何がわかっていないか
・途中まで書いたコードはあるか (あるなら提示してほしい)
を聞きたいです。
とはいえ、他の回答者さんがとっとと答えを書いてしまう可能性があるのでヒントを出しておくと、
今回はstring.hは使えるがctype.hは使えないようなので、半角文字のみ対応でいいのであれば、 のようにカウント対象の文字のリストを文字列として用意しておいて、 のようにstrchrを用いてカウントする実装が考えられます。
フォーラムルールを読み、従ってください。
特に、
・aojiruさんは何がわかっていて、何がわかっていないか
・途中まで書いたコードはあるか (あるなら提示してほしい)
を聞きたいです。
とはいえ、他の回答者さんがとっとと答えを書いてしまう可能性があるのでヒントを出しておくと、
今回はstring.hは使えるがctype.hは使えないようなので、半角文字のみ対応でいいのであれば、 のようにカウント対象の文字のリストを文字列として用意しておいて、 のようにstrchrを用いてカウントする実装が考えられます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 文字列の個数カウント
ctype.hを使うかわりに、ctype.hで宣言される関数を直接宣言して使用する方法もあります。
与えられた文字列のうち、半角の英小文字のみを出力するサンプルです。
与えられた文字列のうち、半角の英小文字のみを出力するサンプルです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 文字列の個数カウント
ctype.h ではなく string.h を使わせようとする出題者の意図が
理解できませんが、使用する環境の文字コードが分かっているなら
その分類表を用意すればよいでしょう。
理解できませんが、使用する環境の文字コードが分かっているなら
その分類表を用意すればよいでしょう。
#include <stdio.h> // scanf, printf
const char t[] = // '0':other, '1':digit, '2':uppercase, '3':lowercase
"0000000000000000000000000000000000000000000000001111111111000000"
"0222222222222222222222222220000003333333333333333333333333300000"
"0000000000000000000000000000000000000000000000000000000000000000"
"0000000000000000000000000000000000000000000000000000000000000000";
int main(void)
{
char s[256];
unsigned char c;
int n[4] = { 0 }; // [0]other, [1]digit, [2]uppercase, [3]lowercase
printf("string=> ");
if (scanf("%255s", s) != 1) return 1;
for (int i = 0; c = s[i]; i++) n[t[c] - '0']++;
printf(" lowercase=>%d uppercase=>%d digit=>%d other=>%d\n",
n[3], n[2], n[1], n[0]);
}
Re: 文字列の個数カウント
scanf の "%s" で入力すると、文字列に空白を含めることができません。
空白も含めたいなら、fgets で 1行入力するとよいでしょう。
最後の改行文字を削除するのに strchr が使えるので、string.h を
使うことになります。
分類表を「数字」ではなく、「数値」にすると、
n[t[c] - '0']++; が n[t[c]]++; と簡単になります。
空白も含めたいなら、fgets で 1行入力するとよいでしょう。
最後の改行文字を削除するのに strchr が使えるので、string.h を
使うことになります。
分類表を「数字」ではなく、「数値」にすると、
n[t[c] - '0']++; が n[t[c]]++; と簡単になります。
#include <stdio.h> // fgets, printf
#include <string.h> // strchr
const char t[256] = { // 0:other, 1:digit, 2:uppercase, 3:lowercase
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,
0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,
0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
};
int main(void)
{
char s[256], *p;
unsigned char c;
int n[4] = { 0 }; // [0]other, [1]digit, [2]uppercase, [3]lowercase
printf("string=> ");
if (!fgets(s, sizeof s, stdin)) return 1;
p = strchr(s, '\n');
if (p) *p = '\0';
for (int i = 0; c = s[i]; i++) n[t[c]]++;
printf(" lowercase=>%d uppercase=>%d digit=>%d other=>%d\n",
n[3], n[2], n[1], n[0]);
}
-
- 記事: 48
- 登録日時: 7年前
Re: 文字列の個数カウント
こんな感じにしてみました。
#include<string.h>
#include<stdio.h>
int IsBigAlpha(char a)
{
if(aが'A'以上かつ'Z'以下なら) return 1;
else return 0;
}
int IsSmallAlpha(char a)
{
if(aが'a'以上かつ'z'以下なら) return 1;
else return 0;
}
int IsNum(char a)
{
if(aが'0'以上かつ'9'以下なら) return 1;
else return 0;
}
int main()
{
char str[100];
int Nc=0,Bc=0,Sc=0,Othc=0;
int i=0;
fgets(配列str,sizeof(str),stdin);
while(配列strが添え字から計算してNULL文字でないなら)
{
if(IsBigAlpha(str[i])) ++Bc;//大文字ならカウント
else if(IsSmallAlpha(str[i])) ++Sc;//小文字ならカウント
else if(IsNum(str[i])) ++Nc;//数字ならカウント
else ++Othc;//その他ならカウント
i++;
}
printf("BIGalpha=%d,Smallalpha=%d,Number=%d,その他=%d\n",Bc,Sc,Nc,Othc);
return 0;
}