文字列中に文字がいくつ含まれているか

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

文字列中に文字がいくつ含まれているか

#1

投稿記事 by やまた » 16年前

はじめまして、ここの掲示板をはじめて利用させていただきます。

(実行画面例)

Input string --->letter
Input charcter ->a

'a' is nothing.
--------------------------

Input string --->letter
Input charcter ->t

't' is 2.

このような実行が行われる処理をしたいです。
やりかたとしてはmain()で入力を行わせて、文字型配列の先頭アドレスと文字を
関数にわたして、そちらでInput charcterで入力した文字の個数を調べさせる処理を行わせ、表示したいです。

よろしくおねがいします。

たかぎ

Re:文字列中に文字がいくつ含まれているか

#2

投稿記事 by たかぎ » 16年前

処理系も不明ですし、どこから入力してどこに表示するのかも分かりません。
一応、勝手に解釈して作ってみました。
#include <iostream>
#include <string>
#include <algorithm>

int main()
{
  std::cin.tie(&std::cout);

  std::cout << "Input string --->";
  std::string str;
  std::cin >> str;

  std::cout << "Input charcter ->";
  char c;
  std::cin >> c;

  if (int n = std::count(str.begin(), str.end(), c))
  {
    std::cout << '\'' << c << "\' is " << n << '.' << std::endl;
  }
  else
  {
    std::cout << '\'' << c << "\' is nothing." << std::endl;
  }
  return 0;
}
C++ですが、処理系には依存していないはずです(自立処理系を除く)。

lbfuvab

Re:文字列中に文字がいくつ含まれているか

#3

投稿記事 by lbfuvab » 16年前

解釈としては"letter"という文字列中に入力された文字がいくつあるかを表示するプログラムで正しいですか?

lbfuvab

Re:文字列中に文字がいくつ含まれているか

#4

投稿記事 by lbfuvab » 16年前

連レスすいません。
何個あるか検索する関数を
int search(char *str,char ch)とすると、
1.カウンタ用変数cntを宣言し0で初期化する
2.*strが0ならcntを返して終了
3.*strがchと同じならcntを1増やす
4.strをインクリメントし2に戻る

で良いんじゃないですか?

やまた

Re:文字列中に文字がいくつ含まれているか

#5

投稿記事 by やまた » 16年前

みなさんありがとうございます。
すいません、説明不足過ぎましたね。

えーと、C言語でlbfuvabの仰る通りです。

#include<stdio.h>

#define MAX_LENGTH 256

int search_ch(char *,char);

int main(void)
{
char str[MAX_LENGTH];
char ch;

printf("\n");
printf("Inpt string : ");
scanf("%s",&str[0]);

printf("Input charcter : ");
scanf("%c",&ch);

int search_ch(&str[0],ch);

return 0;
}
int search_ch(

こんな感じでやろうかと思っています。(ちょっと細かいミスだらけですが
この先どんな風にやればいいでしょう?

non

Re:文字列中に文字がいくつ含まれているか

#6

投稿記事 by non » 16年前

main関数の
>int search_ch(&str[0],ch);
ですが、値を返す関数ですから、何か変数で受けるようにします。
また&str[0]は通常strとしますので
例えば
int n;
n=search_ch(str,ch); のように変数nに代入します。

関数ではlbfuvabさんの説明にあるように、
先頭から *str!='\0' の間繰り返し、
*str==ch なら カウントすればいいです。

たかぎ

Re:文字列中に文字がいくつ含まれているか

#7

投稿記事 by たかぎ » 16年前

素直に書いてしまうと問題があるでしょうから、少しひねって書いてみます。
#include<stdio.h>

#define MAX_LENGTH 255

#define STR(x)  VAL(x)
#define VAL(x)  #x

int search_ch(str, ch)
  char *str;
  int ch;
{
  int cnt = 0;
  for (int c = *str; c != '\0'; c = *++str)
    cnt += (c == ch);
  return cnt;
}

int main(void)
{
  printf("\n");
  printf("Input string --->");
  char str[MAX_LENGTH+1];
  scanf("%" STR(MAX_LENGTH) "[^\n]",str); scanf("%*[^\n]%*c");

  printf("Input charcter ->");
  char ch;
  scanf(" %c",&ch);

  int cnt = search_ch(str, ch);
  if (cnt > 0)
  {
    printf("'%c' is %d.\n", ch, cnt);
  }
  else
  {
    printf("'%c' is nothing.\n", ch);
  }
  return 0;
}
いまいちですが、まあいいでしょう。

lbfuvab

Re:文字列中に文字がいくつ含まれているか

#8

投稿記事 by lbfuvab » 16年前

意地の悪い事しますねぇ・・・

じゃ、私は素直に
#include<stdio.h>

#define MAX_BUF 512

void mygets(char *buf,int Length);
int Search(char *str,char ch);

int main(){
    char str[MAX_BUF],ch;
    int cnt;
    
    printf("Input string --->");
    mygets(str,MAX_BUF);
    printf("Input charcter ->");
    ch=getchar();
    
    cnt=Search(str,ch);
    if(cnt)
        printf("\'%c\' is nothing.\n",ch);
    else
        printf("\'%c\' is %d.\n",cnt);
    return 0;
}

void mygets(char *buf,int Length){  
    int ch;
    
    while(1){
        if((ch=getchar())=='\n' || ch==EOF)
            break;
        if(--Length>0)
            *buf++=ch;
    }
    *buf='\0';
}
int Search(char *str,char ch){
    int cnt=0;
    
    while(*str)
        if(*str++==ch)
            cnt++;
    return cnt;
}

やまた

Re:文字列中に文字がいくつ含まれているか

#9

投稿記事 by やまた » 16年前

たくさんの返信ありがとうございます。

みなさん色々なご回答大変嬉しく、参考にさせていただき、とても感謝しています。
しかし、私がまだ力不足で皆さんの回答を合わせて見れば見るほど
どれが正しいのか?どうしたらいいのか?判断がつかず、いっぱいいっぱです。

なにより私自身の実力不足故、
”ポインタ”という分野の理解不足という問題点が浮かびあがってきました。
回答いただいた皆さんありがとうございました。
本当にこんな簡単な質問に付き合っていただきとても嬉しいです。

たかぎ

Re:文字列中に文字がいくつ含まれているか

#10

投稿記事 by たかぎ » 16年前

> しかし、私がまだ力不足で皆さんの回答を合わせて見れば見るほど
> どれが正しいのか?どうしたらいいのか?判断がつかず、いっぱいいっぱです。

その思考過程を書いてみてください。
そうすれば、あなたがどこまで理解できて、どこにひっかかっているのかが把握できます。
結果として、力不足を多少なりとも解消できるようになると思います。

たかぎ

Re:文字列中に文字がいくつ含まれているか

#11

投稿記事 by たかぎ » 16年前

lbfuvabさん

> 意地の悪い事しますねぇ・・・

そうですか?
ひねってみたのは、search_ch を分離形式で書いたことと、cnt += (c == ch); の部分ぐらいです。
まあ、この辺はちょっと考えれば書き直せますよね。

ところで、lbfuvabさんのコードは期待通りに動きません。
if(cnt)
        printf("\'%c\' is nothing.\n",ch);
    else
        printf("\'%c\' is %d.\n",cnt);
ですが、ifの条件式の論理が逆です。また、else側のprintfで、%cに対応する実引数が抜けています。

non

Re:文字列中に文字がいくつ含まれているか

#12

投稿記事 by non » 16年前

やまたさんへ
ポインタは初心者が最初に迎える難関ですよね。がんばってください。
とりあえず、ポインタの前に配列をよく理解しましょう。
lbfuvabさんの、int Search(char *str,char ch) の関数ですが、これをポインタを使わずに配列の表記で
書くと、
int Search(char str[/url],char ch){
	int cnt=0;
	int i=0;
	while(str!='\0'){
		if(str==ch)
			cnt++;
		i++;
	}
	return cnt;
}

に、なります。これは理解出来ますでしょうか?
次に、lbfuvabさんが使われている、void mygets(char *buf,int Length) の関数ですが、普通にscanfで
OKです。これは、予定した文字数をオーバーしたときの処理やスペースの入力がscanfではできないので、
安全策だと思われますが、オーバーした文字数や、スペースは入力しないなどの条件を理解した上で使う
という前提です。

やまた

Re:文字列中に文字がいくつ含まれているか

#13

投稿記事 by やまた » 16年前

たかぎさん

はい、なにがわからないのか、どこが引っかかっているのか
参考書をゆっくり読み返してみます。
本当にありがとうございます。

nonさん

ポインタで思いっきりつまずきました凹
紙に書くなどして考えていてやっとわかりました。
int Search(char str[/url],char ch){
int cnt=0;
int i=0;
while(str!='\0'){
if(str==ch)
cnt++;
i++;
}
return cnt;
}
というのもわかりました、ありがとうございます。
ひとつひとつ復習していこうとおもいます。

皆様

たくさんのアドバイス、指摘、例文をあげてくださるなど
非常に助かりました。
また、心強いお言葉をいただき、がんばろうと意欲がわきました。
ほんとうにありがとうございました。

non

Re:文字列中に文字がいくつ含まれているか

#14

投稿記事 by non » 16年前

やまたさんへ
配列が分かったなら、次にこれはわかりますか?
int Search(char *str,char ch){
	int cnt=0;
	int i=0;
	while(*(str+i)!='\0'){
		if(*(str+i)==ch)
			cnt++;
		i++;
	}
	return cnt;
}
すなわち、*(str+i) と str は同じと言うことですね。
この場合strは配列の先頭アドレスをあらわします。

lbfuvab

Re:文字列中に文字がいくつ含まれているか

#15

投稿記事 by lbfuvab » 16年前

かえって混乱させたみたいですいません。
適宜間違ってる箇所直して下さい。

たかぎさん、指摘ありがとうございました。

閉鎖

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