入力した文字の中から任意の文字の個数を数え、その個数を表示する方法

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

入力した文字の中から任意の文字の個数を数え、その個数を表示する方法

#1

投稿記事 by pptt » 1ヶ月前

英文字,英記号(スペースを含む)からなる20文字以下の文字列をキーボードから入力すると,その中でe*r という文字列が何回使われているかを出力するプログラムを作成しなさい。但し,*は任意の英文字,英記号1文字を表し,大文字と小文字を区別する。
出力例↓
Input a string:Eareer me ranenr
The total number of e*r is 4.

という課題です。プログラムを組んでみたのですが、出力例の4の部分が20になってしまい上手くいきません。どこが間違っているかが分からないので、教えていただきたいです。

コード:

#include <stdio.h>
int main(void)
{
	char str[20];

	printf("Input a string: ");
	fgets(str, 20 ,stdin);
	
	int i;
	int e=0;
	int r=0;
	
	for(i=0;i<20;i++){
		if( str[i] = 'e' ){
			e += 1;
		}
		if( str[i] = 'r' ){
			r += 1;
		}
	}
	
	int er;
	if(e <= r){
		er = e;
	}
	else{
		er = r;
	}
	
	printf("The total number of e*r is %d.\n", er);
	
  return 0;
}

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

Re: 入力した文字の中から任意の文字の個数を数え、その個数を表示する方法

#2

投稿記事 by みけCAT » 1ヶ月前

  • if文の中で比較せずに非0の数を代入しているので、常に真になる
  • eやrの位置関係を考慮せずに判定している
  • 20文字以下の文字列を入力するのに、バッファが20バイトしかなく、改行文字や終端文字が入らない
  • 入力バッファを初期化していない上に、文字列が読み込まれていない可能性がある部分も判定の対象にしている
  • 出力例ではInput a string:の後に空白が入っていないのに、コードでは空白が入ってしまっている
  • 「大文字と小文字を区別する」は普通「読みが同じ文字であっても、大文字なのか小文字なのかが違えば違う文字とみなす」という意味であると考えられるが、出力例では大文字のEが使われているEarもe*rとみなしているようであり、誤解を与える
というところが間違っているようです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: 入力した文字の中から任意の文字の個数を数え、その個数を表示する方法

#3

投稿記事 by みけCAT » 1ヶ月前

修正してみました。

コード:

#include <stdio.h>
int main(void)
{
	char str[20 + 2] = "";

	printf("Input a string:");
	fgets(str, sizeof(str) ,stdin);
	
	int i;
	int er=0;
	
	for(i=2;str[i]!='\0';i++){
		if( (str[i - 2] == 'e' || str[i - 2] == 'E') && (str[i] == 'r' || str[i] == 'R') ){
			er += 1;
		}
	}
	
	printf("The total number of e*r is %d.\n", er);
	
	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

Re: 入力した文字の中から任意の文字の個数を数え、その個数を表示する方法

#4

投稿記事 by かずま » 1ヶ月前

別解です。文字コードが ASCII であることを仮定しています。

コード:

#include <stdio.h>

#define X12(x) x,x,x,x,x,x,x,x,x,x,x,x
#define X13(x) X12(x),x
#define X18(x) X13(x),x,x,x,x,x
#define X69(x) X18(x),X18(x),X18(x),X13(x),x,x

char dfa[6][128] = {  // Deterministic Finite Automaton
	// \0..D, E,  F..Q,  R,  S..d,  e,  f..q,  r,  s..\177
	{ X69(0), 2, X12(0), 0, X18(0), 2, X12(0), 0, X13(0) },  // 0
	{ X69(0), 1, X12(0), 4, X18(0), 1, X12(0), 4, X13(0) },  // 1
	{ X69(1), 3, X12(1), 1, X18(1), 3, X12(1), 1, X13(1) },  // 2
	{ X69(1), 3, X12(1), 5, X18(1), 3, X12(1), 5, X13(1) },  // 3
};                                                        // 4, 5

int main(void)
{
	char s[256];
	while (1) {
		printf("Input a string:");
		if (!fgets(s, sizeof(s), stdin) || *s == '\n') break;
		int n = 0, t = 0, i = 0;
		while (s[i]) (t = dfa[t][s[i++]]) > 3 && (n++, t -= 4);
		printf("The total number of e*r is %d.\n", n);
	}
	return 0;
}
なぜ、質問者は回答に応答しないのでしょうか?

返信

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