文字列中に文字がいくつ含まれているか
文字列中に文字がいくつ含まれているか
はじめまして、ここの掲示板をはじめて利用させていただきます。
(実行画面例)
Input string --->letter
Input charcter ->a
'a' is nothing.
--------------------------
Input string --->letter
Input charcter ->t
't' is 2.
このような実行が行われる処理をしたいです。
やりかたとしてはmain()で入力を行わせて、文字型配列の先頭アドレスと文字を
関数にわたして、そちらでInput charcterで入力した文字の個数を調べさせる処理を行わせ、表示したいです。
よろしくおねがいします。
(実行画面例)
Input string --->letter
Input charcter ->a
'a' is nothing.
--------------------------
Input string --->letter
Input charcter ->t
't' is 2.
このような実行が行われる処理をしたいです。
やりかたとしてはmain()で入力を行わせて、文字型配列の先頭アドレスと文字を
関数にわたして、そちらでInput charcterで入力した文字の個数を調べさせる処理を行わせ、表示したいです。
よろしくおねがいします。
Re:文字列中に文字がいくつ含まれているか
処理系も不明ですし、どこから入力してどこに表示するのかも分かりません。
一応、勝手に解釈して作ってみました。
一応、勝手に解釈して作ってみました。
#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++ですが、処理系には依存していないはずです(自立処理系を除く)。
Re:文字列中に文字がいくつ含まれているか
連レスすいません。
何個あるか検索する関数を
int search(char *str,char ch)とすると、
1.カウンタ用変数cntを宣言し0で初期化する
2.*strが0ならcntを返して終了
3.*strがchと同じならcntを1増やす
4.strをインクリメントし2に戻る
で良いんじゃないですか?
何個あるか検索する関数を
int search(char *str,char ch)とすると、
1.カウンタ用変数cntを宣言し0で初期化する
2.*strが0ならcntを返して終了
3.*strがchと同じならcntを1増やす
4.strをインクリメントし2に戻る
で良いんじゃないですか?
Re:文字列中に文字がいくつ含まれているか
みなさんありがとうございます。
すいません、説明不足過ぎましたね。
えーと、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(
こんな感じでやろうかと思っています。(ちょっと細かいミスだらけですが
この先どんな風にやればいいでしょう?
すいません、説明不足過ぎましたね。
えーと、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(
こんな感じでやろうかと思っています。(ちょっと細かいミスだらけですが
この先どんな風にやればいいでしょう?
Re:文字列中に文字がいくつ含まれているか
main関数の
>int search_ch(&str[0],ch);
ですが、値を返す関数ですから、何か変数で受けるようにします。
また&str[0]は通常strとしますので
例えば
int n;
n=search_ch(str,ch); のように変数nに代入します。
関数ではlbfuvabさんの説明にあるように、
先頭から *str!='\0' の間繰り返し、
*str==ch なら カウントすればいいです。
>int search_ch(&str[0],ch);
ですが、値を返す関数ですから、何か変数で受けるようにします。
また&str[0]は通常strとしますので
例えば
int n;
n=search_ch(str,ch); のように変数nに代入します。
関数ではlbfuvabさんの説明にあるように、
先頭から *str!='\0' の間繰り返し、
*str==ch なら カウントすればいいです。
Re:文字列中に文字がいくつ含まれているか
素直に書いてしまうと問題があるでしょうから、少しひねって書いてみます。
#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; }いまいちですが、まあいいでしょう。
Re:文字列中に文字がいくつ含まれているか
意地の悪い事しますねぇ・・・
じゃ、私は素直に
じゃ、私は素直に
#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:文字列中に文字がいくつ含まれているか
たくさんの返信ありがとうございます。
みなさん色々なご回答大変嬉しく、参考にさせていただき、とても感謝しています。
しかし、私がまだ力不足で皆さんの回答を合わせて見れば見るほど
どれが正しいのか?どうしたらいいのか?判断がつかず、いっぱいいっぱです。
なにより私自身の実力不足故、
”ポインタ”という分野の理解不足という問題点が浮かびあがってきました。
回答いただいた皆さんありがとうございました。
本当にこんな簡単な質問に付き合っていただきとても嬉しいです。
みなさん色々なご回答大変嬉しく、参考にさせていただき、とても感謝しています。
しかし、私がまだ力不足で皆さんの回答を合わせて見れば見るほど
どれが正しいのか?どうしたらいいのか?判断がつかず、いっぱいいっぱです。
なにより私自身の実力不足故、
”ポインタ”という分野の理解不足という問題点が浮かびあがってきました。
回答いただいた皆さんありがとうございました。
本当にこんな簡単な質問に付き合っていただきとても嬉しいです。
Re:文字列中に文字がいくつ含まれているか
> しかし、私がまだ力不足で皆さんの回答を合わせて見れば見るほど
> どれが正しいのか?どうしたらいいのか?判断がつかず、いっぱいいっぱです。
その思考過程を書いてみてください。
そうすれば、あなたがどこまで理解できて、どこにひっかかっているのかが把握できます。
結果として、力不足を多少なりとも解消できるようになると思います。
> どれが正しいのか?どうしたらいいのか?判断がつかず、いっぱいいっぱです。
その思考過程を書いてみてください。
そうすれば、あなたがどこまで理解できて、どこにひっかかっているのかが把握できます。
結果として、力不足を多少なりとも解消できるようになると思います。
Re:文字列中に文字がいくつ含まれているか
lbfuvabさん
> 意地の悪い事しますねぇ・・・
そうですか?
ひねってみたのは、search_ch を分離形式で書いたことと、cnt += (c == ch); の部分ぐらいです。
まあ、この辺はちょっと考えれば書き直せますよね。
ところで、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に対応する実引数が抜けています。
Re:文字列中に文字がいくつ含まれているか
やまたさんへ
ポインタは初心者が最初に迎える難関ですよね。がんばってください。
とりあえず、ポインタの前に配列をよく理解しましょう。
lbfuvabさんの、int Search(char *str,char ch) の関数ですが、これをポインタを使わずに配列の表記で
書くと、
に、なります。これは理解出来ますでしょうか?
次に、lbfuvabさんが使われている、void mygets(char *buf,int Length) の関数ですが、普通にscanfで
OKです。これは、予定した文字数をオーバーしたときの処理やスペースの入力がscanfではできないので、
安全策だと思われますが、オーバーした文字数や、スペースは入力しないなどの条件を理解した上で使う
という前提です。
ポインタは初心者が最初に迎える難関ですよね。がんばってください。
とりあえず、ポインタの前に配列をよく理解しましょう。
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:文字列中に文字がいくつ含まれているか
たかぎさん
はい、なにがわからないのか、どこが引っかかっているのか
参考書をゆっくり読み返してみます。
本当にありがとうございます。
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さん
ポインタで思いっきりつまずきました凹
紙に書くなどして考えていてやっとわかりました。
int Search(char str[/url],char ch){
int cnt=0;
int i=0;
while(str!='\0'){
if(str==ch)
cnt++;
i++;
}
return cnt;
}
というのもわかりました、ありがとうございます。
ひとつひとつ復習していこうとおもいます。
皆様
たくさんのアドバイス、指摘、例文をあげてくださるなど
非常に助かりました。
また、心強いお言葉をいただき、がんばろうと意欲がわきました。
ほんとうにありがとうございました。
Re:文字列中に文字がいくつ含まれているか
やまたさんへ
配列が分かったなら、次にこれはわかりますか?
この場合strは配列の先頭アドレスをあらわします。
配列が分かったなら、次にこれはわかりますか?
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は配列の先頭アドレスをあらわします。