ページ 11

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

Posted: 2019年9月17日(火) 16:54
by pptt
英文字,英記号(スペースを含む)からなる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;
}

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

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

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

Posted: 2019年9月17日(火) 17:29
by みけCAT
修正してみました。

コード:

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

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

Posted: 2019年9月20日(金) 16:52
by かずま
別解です。文字コードが 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;
}
なぜ、質問者は回答に応答しないのでしょうか?