C++で文字列のカウントを行いたいんですが

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

C++で文字列のカウントを行いたいんですが

#1

投稿記事 by » 15年前

はじめて投稿いたします

現在、C++にて
文字列(アルファベット大文字、小文字、数字の3種類のみ)を入力して
文字列の長さとそれぞれの文字列をカウントして出力したいと考えています。

たとえば、
>>ABcde1340
なら、
大文字:2個
小文字:3個
数字:4個
長さ:9個

AAAAbb23
なら、
大文字:4個
小文字:2個
数字:2個
長さ:8個
のように表示させたいです

isdigit関数など調べましたがあまり使い方がわからなくて困っています…
よろしくお願いします

たかぎ

Re:C++で文字列のカウントを行いたいんですが

#2

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

こんな感じでしょうか?
#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>

class is
{
    int (*f_)(int);
public:
    is(int (*f)(int)) : f_(f) {}
    bool operator()(char c) const { return (*f_)(static_cast<unsigned char>(c)); }
};

int main()
{
    std::string str;
    std::getline(std::cin, str);

    std::cout << "大文字なら:"
        << std::count_if(str.begin(), str.end(), is(&std::isupper))
        << "個\n";
    std::cout << "小文字なら:"
        << std::count_if(str.begin(), str.end(), is(&std::islower))
        << "個\n";
    std::cout << "数字なら:"
        << std::count_if(str.begin(), str.end(), is(&std::isdigit))
        << "個\n";
    std::cout << "長さ:" << str.size() << "個" << std::endl;
}
is系関数は、char型の値を直接渡せないのが面倒ですね。
画像

たかぎ

Re:C++で文字列のカウントを行いたいんですが

#3

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

最近、あとから(誤記等を)編集すると 画像マークが出るんですね。

y

Re:C++で文字列のカウントを行いたいんですが

#4

投稿記事 by y » 15年前

動作しました
ありがとうございます

簡単に解説をお願いしてもいいですか?

#include <iostream>
#include <string>
#include <algorithm>
#include <cctype> ←.hがなくても動作するのはなぜでしょうか?

class is
{
int (*f_)(int);
public:
is(int (*f)(int)) : f_(f) {}
bool operator()(char c) const { return (*f_)(static_cast<unsigned char>(c)); }
};
           クラス使ったことなくて↑の意味が全く理解できません…一体何の
           処理を行っているのでしょうか?無知ですいません…
int main()
{
std::string str;
std::getline(std::cin, str);

std::cout << "大文字なら:"
<< std::count_if(str.begin(), str.end(), is(&std::isupper))
<< "個\n";
std::cout << "小文字なら:"
<< std::count_if(str.begin(), str.end(), is(&std::islower))
<< "個\n";
std::cout << "数字なら:"
<< std::count_if(str.begin(), str.end(), is(&std::isdigit))
<< "個\n";
std::cout << "長さ:" << str.size() << "個" << std::endl;

}  入力の結果がstd::cout << "数字なら:"
<< std::count_if(str.begin(), str.end(), is(&std::isdigit))
<< "個\n";の文で表示されるのはなぜでしょう?
.begin()と.end()は文字列の初めの文字から終わりの文字までを表しているのでしょうか?
一般に言われるswitch文なんでしょうか?

y

Re:C++で文字列のカウントを行いたいんですが

#5

投稿記事 by y » 15年前

追記

クラスを使わないでプログラムも作れるんでしょうか?

たかぎ

Re:C++で文字列のカウントを行いたいんですが

#6

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

> 簡単に解説をお願いしてもいいですか?

自分で頑張って解析してみてください。

> クラスを使わないでプログラムも作れるんでしょうか?

作れます。
ただ、解説のお願いとあわせて考えると、C++ではなくCを使ったほうがよいのでは?

y

Re:C++で文字列のカウントを行いたいんですが

#7

投稿記事 by y » 15年前

わかりました
がんばってみます
ありがとうございます

y

Re:C++で文字列のカウントを行いたいんですが

#8

投稿記事 by y » 15年前

何度もすいません

先ほどの
#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>

class is
{
int (*f_)(int);
public:
is(int (*f)(int)) : f_(f) {}
bool operator()(char c) const { return (*f_)(static_cast<unsigned char>(c)); }
};

int main()
{

std::string str;
std::getline(std::cin, str);

std::cout << "大文字なら:"
<< std::count_if(str.begin(), str.end(), is(&std::isupper))
<< "個\n";
std::cout << "小文字なら:"
<< std::count_if(str.begin(), str.end(), is(&std::islower))
<< "個\n";
std::cout << "数字なら:"
<< std::count_if(str.begin(), str.end(), is(&std::isdigit))
<< "個\n";
std::cout << "長さ:" << str.size() << "個" << std::endl;

}   で大文字をaに代入、小文字をbに代入、数字をc、長さをdに代入したいんですが
a=std;ではできませんでした・・・

たかぎ

Re:C++で文字列のカウントを行いたいんですが

#9

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

> 大文字をaに代入、小文字をbに代入、数字をc、長さをdに代入したいんですが
> a=std;ではできませんでした・・・

すみません。意味がわかりませんでした。

大文字をaに代入とはどういうことでしょうか?

aBc234De

を入力すれば、aには"BD"が代入されるのでしょうか?
そもそもaの型は?

a=std;も何がしたいのかわかりません。

y

Re:C++で文字列のカウントを行いたいんですが

#10

投稿記事 by y » 15年前

説明不足ですいません・・・

AAAAbb23
なら、
大文字:4個
小文字:2個
数字:2個
長さ:8個 ですよね

この大文字の4をaに代入
小文字の2をbに
数字と長さも同様に代入したいんです…

たかぎ

Re:C++で文字列のカウントを行いたいんですが

#11

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

それなら、count_ifの返却値を代入するだけです。
よくわからないなら、count_ifを中心に調べていけば、芋づる式にわかるはずです。

y

Re:C++で文字列のカウントを行いたいんですが

#12

投稿記事 by y » 15年前

いろいろ調べたんですが

std::string str;
std::getline(std::cin, str);

std::cout << "大文字なら:"
<< std::count_if(str.begin(), str.end(), is(&std::isupper))
<< "個\n";
std::cout << "小文字なら:"
<< std::count_if(str.begin(), str.end(), is(&std::islower))
<< "個\n";
std::cout << "数字なら:"
<< std::count_if(str.begin(), str.end(), is(&std::isdigit))
<< "個\n";
std::cout << "長さ:" << str.size() << "個" << std::endl;

a=count_if(str.begin(), str.end(), is(&std::isupper))
ではできませんでした
やり方が違うんですかね?
<<の意味も調べたんですがわかりません…

たかぎ

Re:C++で文字列のカウントを行いたいんですが

#13

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

> a=count_if(str.begin(), str.end(), is(&std::isupper))
> ではできませんでした

aの宣言はどこにありますか?
また、std::を省略していますが、using宣言またはusing指令は適切に行なっていますか?

> <<の意味も調べたんですがわかりません…

C++の入門書であれば、(本にもよりますが)本文の1ページ目に出てくるような内容です。

y

Re:C++で文字列のカウントを行いたいんですが

#14

投稿記事 by y » 15年前

コピペしきれてなかったです。・・・


int a;
std::string str;
std::getline(std::cin, str);

std::cout << "大文字なら:"
<< std::count_if(str.begin(), str.end(), is(&std::isupper))
<< "個\n";
std::cout << "小文字なら:"
<< std::count_if(str.begin(), str.end(), is(&std::islower))
<< "個\n";
std::cout << "数字なら:"
<< std::count_if(str.begin(), str.end(), is(&std::isdigit))
<< "個\n";
std::cout << "長さ:" << str.size() << "個" << std::endl;

a=std::count_if(str.begin(), str.end(), is(&std::isupper)) でもできませんでした
using宣言またはusing指令はしてません

また、aはintでは型が違うのでできませんでした。。

たかぎ

Re:C++で文字列のカウントを行いたいんですが

#15

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

私の手元では問題なくコンパイル、実行できます。
何がどうできないのか補足してください。

> また、aはintでは型が違うのでできませんでした。。

これも意味がわかりません。

Re:C++で文字列のカウントを行いたいんですが

#16

投稿記事 by » 15年前

c:\users\yuuta\desktop\ex1\ex1\ex1.cpp(22) : error C2297: '<<' : 無効です。右オペランドには型 'const char [4]' が指定されています。
c:\users\yuuta\desktop\ex1\ex1\ex1.cpp(22) : error C2679: 二項演算子 '=' : 型 '__w64 int' の右オペランドを扱う演算子が見つかりません (または変換できません)。
c:\program files\microsoft visual studio 8\vc\include\ostream587): 'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator =(const std::basic_ostream<_Elem,_Traits> &)' の可能性があります。
with
[
_Elem=char,
_Traits=std::char_traits<char>
]
引数リスト '(std::basic_ostream<_Elem,_Traits>, __w64 int)' を一致させようとしているとき
with
[
_Elem=char,
_Traits=std::char_traits<char>
]

というエラーが出ます。

#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>

class is
{
int (*f_)(int);
public:
is(int (*f)(int)) : f_(f) {}
bool operator()(char c) const { return (*f_)(static_cast<unsigned char>(c)); }
};

int main()
{
int a;
std::string str;
std::getline(std::cin, str);

std::cout << "大文字なら:"
<< a=std::count_if(str.begin(), str.end(), is(&std::isupper))
<< "個\n";
std::cout << "小文字なら:"
<< b=std::count_if(str.begin(), str.end(), is(&std::islower))
<< "個\n";
std::cout << "数字なら:"
<< c=std::count_if(str.begin(), str.end(), is(&std::isdigit))
<< "個\n";
std::cout << "長さ:" << d=str.size() << "個" << std::endl;


}

たかぎ

Re:C++で文字列のカウントを行いたいんですが

#17

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

演算子の優先順位について調べてみてください。

y

Re:C++で文字列のカウントを行いたいんですが

#18

投稿記事 by y » 15年前

調べて編集しました
#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>

class is
{
int (*f_)(int);
public:
is(int (*f)(int)) : f_(f) {}
bool operator()(char c) const { return (*f_)(static_cast<unsigned char>(c)); }
};

int main()
{
int a,b,c,d;
std::string str;
std::getline(std::cin, str);

std::cout << "大文字なら:";
a=std::count_if(str.begin(), str.end(), is(&std::isupper));
printf("%d個\n",a);
std::cout << "小文字なら:";
b=std::count_if(str.begin(), str.end(), is(&std::islower));
printf("%d個\n",b);
std::cout << "数字なら:";
c=std::count_if(str.begin(), str.end(), is(&std::isdigit));
printf("%d個\n",c);
std::cout << "長さ:";
d=str.size();
printf("%d個\n",d);
}

これで誤作動なく動きました
あってますか?

たかぎ

Re:C++で文字列のカウントを行いたいんですが

#19

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

> あってますか?

(エラーメッセージから想像はつきますが)処理系不明の状況では、「いいえ」としかいえません。
今さらですが...
[flash 600,100]http://dixq.net/flash/kiyaku4.swf[/flash]

閉鎖

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