C++で文字列のカウントを行いたいんですが
C++で文字列のカウントを行いたいんですが
はじめて投稿いたします
現在、C++にて
文字列(アルファベット大文字、小文字、数字の3種類のみ)を入力して
文字列の長さとそれぞれの文字列をカウントして出力したいと考えています。
たとえば、
>>ABcde1340
なら、
大文字:2個
小文字:3個
数字:4個
長さ:9個
AAAAbb23
なら、
大文字:4個
小文字:2個
数字:2個
長さ:8個
のように表示させたいです
isdigit関数など調べましたがあまり使い方がわからなくて困っています…
よろしくお願いします
現在、C++にて
文字列(アルファベット大文字、小文字、数字の3種類のみ)を入力して
文字列の長さとそれぞれの文字列をカウントして出力したいと考えています。
たとえば、
>>ABcde1340
なら、
大文字:2個
小文字:3個
数字:4個
長さ:9個
AAAAbb23
なら、
大文字:4個
小文字:2個
数字:2個
長さ:8個
のように表示させたいです
isdigit関数など調べましたがあまり使い方がわからなくて困っています…
よろしくお願いします
Re:C++で文字列のカウントを行いたいんですが
こんな感じでしょうか?

#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++で文字列のカウントを行いたいんですが
動作しました
ありがとうございます
簡単に解説をお願いしてもいいですか?
#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文なんでしょうか?
ありがとうございます
簡単に解説をお願いしてもいいですか?
#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文なんでしょうか?
Re:C++で文字列のカウントを行いたいんですが
> 簡単に解説をお願いしてもいいですか?
自分で頑張って解析してみてください。
> クラスを使わないでプログラムも作れるんでしょうか?
作れます。
ただ、解説のお願いとあわせて考えると、C++ではなくCを使ったほうがよいのでは?
自分で頑張って解析してみてください。
> クラスを使わないでプログラムも作れるんでしょうか?
作れます。
ただ、解説のお願いとあわせて考えると、C++ではなくCを使ったほうがよいのでは?
Re:C++で文字列のカウントを行いたいんですが
何度もすいません
先ほどの
#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;ではできませんでした・・・
先ほどの
#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++で文字列のカウントを行いたいんですが
> 大文字をaに代入、小文字をbに代入、数字をc、長さをdに代入したいんですが
> a=std;ではできませんでした・・・
すみません。意味がわかりませんでした。
大文字をaに代入とはどういうことでしょうか?
aBc234De
を入力すれば、aには"BD"が代入されるのでしょうか?
そもそもaの型は?
a=std;も何がしたいのかわかりません。
> a=std;ではできませんでした・・・
すみません。意味がわかりませんでした。
大文字をaに代入とはどういうことでしょうか?
aBc234De
を入力すれば、aには"BD"が代入されるのでしょうか?
そもそもaの型は?
a=std;も何がしたいのかわかりません。
Re:C++で文字列のカウントを行いたいんですが
説明不足ですいません・・・
AAAAbb23
なら、
大文字:4個
小文字:2個
数字:2個
長さ:8個 ですよね
この大文字の4をaに代入
小文字の2をbに
数字と長さも同様に代入したいんです…
AAAAbb23
なら、
大文字:4個
小文字:2個
数字:2個
長さ:8個 ですよね
この大文字の4をaに代入
小文字の2をbに
数字と長さも同様に代入したいんです…
Re:C++で文字列のカウントを行いたいんですが
それなら、count_ifの返却値を代入するだけです。
よくわからないなら、count_ifを中心に調べていけば、芋づる式にわかるはずです。
よくわからないなら、count_ifを中心に調べていけば、芋づる式にわかるはずです。
Re:C++で文字列のカウントを行いたいんですが
いろいろ調べたんですが
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))
ではできませんでした
やり方が違うんですかね?
<<の意味も調べたんですがわかりません…
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++で文字列のカウントを行いたいんですが
> a=count_if(str.begin(), str.end(), is(&std::isupper))
> ではできませんでした
aの宣言はどこにありますか?
また、std::を省略していますが、using宣言またはusing指令は適切に行なっていますか?
> <<の意味も調べたんですがわかりません…
C++の入門書であれば、(本にもよりますが)本文の1ページ目に出てくるような内容です。
> ではできませんでした
aの宣言はどこにありますか?
また、std::を省略していますが、using宣言またはusing指令は適切に行なっていますか?
> <<の意味も調べたんですがわかりません…
C++の入門書であれば、(本にもよりますが)本文の1ページ目に出てくるような内容です。
Re:C++で文字列のカウントを行いたいんですが
コピペしきれてなかったです。・・・
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では型が違うのでできませんでした。。
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++で文字列のカウントを行いたいんですが
私の手元では問題なくコンパイル、実行できます。
何がどうできないのか補足してください。
> また、aはintでは型が違うのでできませんでした。。
これも意味がわかりません。
何がどうできないのか補足してください。
> また、aはintでは型が違うのでできませんでした。。
これも意味がわかりません。
Re:C++で文字列のカウントを行いたいんですが
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;
}
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++で文字列のカウントを行いたいんですが
調べて編集しました
#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);
}
これで誤作動なく動きました
あってますか?
#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++で文字列のカウントを行いたいんですが
> あってますか?
(エラーメッセージから想像はつきますが)処理系不明の状況では、「いいえ」としかいえません。
今さらですが...
[flash 600,100]http://dixq.net/flash/kiyaku4.swf[/flash]
(エラーメッセージから想像はつきますが)処理系不明の状況では、「いいえ」としかいえません。
今さらですが...
[flash 600,100]http://dixq.net/flash/kiyaku4.swf[/flash]