文字列の個数カウント

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
aojiru

文字列の個数カウント

#1

投稿記事 by aojiru » 5年前

問題
『キーボードから入力した文字列も調べ、英小文字、英大文字、数字、その他の個数を表示する』

実行結果
『文字列=>aBc12D#$
 英小文字=>2個  英大文字=>2個  数字=>2個  その他=>2個 』

はどのようにして作成すればよいでしょうか?
使用するのは stdio.h と string.h の2つです。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 文字列の個数カウント

#2

投稿記事 by みけCAT » 5年前

課題の丸投げは禁止です。
フォーラムルールを読み、従ってください。

特に、
・aojiruさんは何がわかっていて、何がわかっていないか
・途中まで書いたコードはあるか (あるなら提示してほしい)
を聞きたいです。

とはいえ、他の回答者さんがとっとと答えを書いてしまう可能性があるのでヒントを出しておくと、
今回はstring.hは使えるがctype.hは使えないようなので、半角文字のみ対応でいいのであれば、

コード:

const char* KOMOZI = "abcdefghijklmnopqrstuvwxyz";
のようにカウント対象の文字のリストを文字列として用意しておいて、

コード:

if (strchr(KOMOZI, input[i]) != NULL) komoziCount++;
のようにstrchrを用いてカウントする実装が考えられます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 文字列の個数カウント

#3

投稿記事 by みけCAT » 5年前

ctype.hを使うかわりに、ctype.hで宣言される関数を直接宣言して使用する方法もあります。

与えられた文字列のうち、半角の英小文字のみを出力するサンプルです。

コード:

#include <stdio.h>

/* 関数の宣言 */
int islower(int c);

int main(void) {
	char str[] = "abcABC123!#$";
	int i;
	for (i = 0; str[i] != '\0'; i++) {
		/* unsigned charにキャストしないと、
		全角文字などが入力されたときに負の数が入って異常動作する可能性がある */
		if (islower((unsigned char)str[i])) putchar(str[i]);
	}
	putchar('\n');
	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

Re: 文字列の個数カウント

#4

投稿記事 by かずま » 5年前

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: 文字列の個数カウント

#5

投稿記事 by かずま » 5年前

scanf の "%s" で入力すると、文字列に空白を含めることができません。
空白も含めたいなら、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]);
}

littlestream
記事: 48
登録日時: 7年前

Re: 文字列の個数カウント

#6

投稿記事 by littlestream » 5年前

こんな感じにしてみました。

コード:

#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;
}

返信

“C言語何でも質問掲示板” へ戻る