ページ 1 / 1
文字列中に文字がいくつ含まれているか
Posted: 2008年11月02日(日) 12:42
by やまた
はじめまして、ここの掲示板をはじめて利用させていただきます。
(実行画面例)
Input string --->letter
Input charcter ->a
'a' is nothing.
--------------------------
Input string --->letter
Input charcter ->t
't' is 2.
このような実行が行われる処理をしたいです。
やりかたとしてはmain()で入力を行わせて、文字型配列の先頭アドレスと文字を
関数にわたして、そちらでInput charcterで入力した文字の個数を調べさせる処理を行わせ、表示したいです。
よろしくおねがいします。
Re:文字列中に文字がいくつ含まれているか
Posted: 2008年11月02日(日) 13:13
by たかぎ
処理系も不明ですし、どこから入力してどこに表示するのかも分かりません。
一応、勝手に解釈して作ってみました。
#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:文字列中に文字がいくつ含まれているか
Posted: 2008年11月02日(日) 13:30
by lbfuvab
解釈としては"letter"という文字列中に入力された文字がいくつあるかを表示するプログラムで正しいですか?
Re:文字列中に文字がいくつ含まれているか
Posted: 2008年11月02日(日) 13:48
by lbfuvab
連レスすいません。
何個あるか検索する関数を
int search(char *str,char ch)とすると、
1.カウンタ用変数cntを宣言し0で初期化する
2.*strが0ならcntを返して終了
3.*strがchと同じならcntを1増やす
4.strをインクリメントし2に戻る
で良いんじゃないですか?
Re:文字列中に文字がいくつ含まれているか
Posted: 2008年11月02日(日) 17:18
by やまた
みなさんありがとうございます。
すいません、説明不足過ぎましたね。
えーと、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:文字列中に文字がいくつ含まれているか
Posted: 2008年11月02日(日) 17:50
by non
main関数の
>int search_ch(&str[0],ch);
ですが、値を返す関数ですから、何か変数で受けるようにします。
また&str[0]は通常strとしますので
例えば
int n;
n=search_ch(str,ch); のように変数nに代入します。
関数ではlbfuvabさんの説明にあるように、
先頭から *str!='\0' の間繰り返し、
*str==ch なら カウントすればいいです。
Re:文字列中に文字がいくつ含まれているか
Posted: 2008年11月03日(月) 11:38
by たかぎ
素直に書いてしまうと問題があるでしょうから、少しひねって書いてみます。
#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:文字列中に文字がいくつ含まれているか
Posted: 2008年11月03日(月) 21:12
by lbfuvab
意地の悪い事しますねぇ・・・
じゃ、私は素直に
#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:文字列中に文字がいくつ含まれているか
Posted: 2008年11月03日(月) 21:45
by やまた
たくさんの返信ありがとうございます。
みなさん色々なご回答大変嬉しく、参考にさせていただき、とても感謝しています。
しかし、私がまだ力不足で皆さんの回答を合わせて見れば見るほど
どれが正しいのか?どうしたらいいのか?判断がつかず、いっぱいいっぱです。
なにより私自身の実力不足故、
”ポインタ”という分野の理解不足という問題点が浮かびあがってきました。
回答いただいた皆さんありがとうございました。
本当にこんな簡単な質問に付き合っていただきとても嬉しいです。
Re:文字列中に文字がいくつ含まれているか
Posted: 2008年11月03日(月) 21:48
by たかぎ
> しかし、私がまだ力不足で皆さんの回答を合わせて見れば見るほど
> どれが正しいのか?どうしたらいいのか?判断がつかず、いっぱいいっぱです。
その思考過程を書いてみてください。
そうすれば、あなたがどこまで理解できて、どこにひっかかっているのかが把握できます。
結果として、力不足を多少なりとも解消できるようになると思います。
Re:文字列中に文字がいくつ含まれているか
Posted: 2008年11月03日(月) 21:59
by たかぎ
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:文字列中に文字がいくつ含まれているか
Posted: 2008年11月04日(火) 12:36
by non
やまたさんへ
ポインタは初心者が最初に迎える難関ですよね。がんばってください。
とりあえず、ポインタの前に配列をよく理解しましょう。
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:文字列中に文字がいくつ含まれているか
Posted: 2008年11月04日(火) 15:43
by やまた
たかぎさん
はい、なにがわからないのか、どこが引っかかっているのか
参考書をゆっくり読み返してみます。
本当にありがとうございます。
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:文字列中に文字がいくつ含まれているか
Posted: 2008年11月04日(火) 15:54
by non
やまたさんへ
配列が分かったなら、次にこれはわかりますか?
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は配列の先頭アドレスをあらわします。
Re:文字列中に文字がいくつ含まれているか
Posted: 2008年11月04日(火) 17:21
by lbfuvab
かえって混乱させたみたいですいません。
適宜間違ってる箇所直して下さい。
たかぎさん、指摘ありがとうございました。