C ++で文字列のすべての文字に対してforループを実行するにはどうすればよいですか?
char
、Unicodeコードポイント、拡張書記素クラスター?
C ++で文字列のすべての文字に対してforループを実行するにはどうすればよいですか?
char
、Unicodeコードポイント、拡張書記素クラスター?
回答:
ループする文字のstd::string
使用して、範囲ベースのループ(まだGCC、打ち鳴らすの最近のリリースではサポートされ、C ++から11だ、とVC11ベータ)のために:
std::string str = ???;
for(char& c : str) {
do_things_with(c);
}
std::string
イテレータでaの文字をループする:
std::string str = ???;
for(std::string::iterator it = str.begin(); it != str.end(); ++it) {
do_things_with(*it);
}
std::string
昔ながらのforループでaの文字をループする:
std::string str = ???;
for(std::string::size_type i = 0; i < str.size(); ++i) {
do_things_with(str[i]);
}
nullで終了する文字配列の文字をループする:
char* str = ???;
for(char* it = str; *it; ++it) {
do_things_with(*it);
}
std::string
あります。
forループは次のように実装できます。
string str("HELLO");
for (int i = 0; i < str.size(); i++){
cout << str[i];
}
これにより、文字列が文字ごとに出力されます。str[i]
インデックスの文字を返しますi
。
文字配列の場合:
char str[6] = "hello";
for (int i = 0; str[i] != '\0'; i++){
cout << str[i];
}
基本的に上記の2つは、c ++でサポートされる2つのタイプの文字列です。2つ目はc文字列と呼ばれ、1つ目はstd文字列または(c ++文字列)と呼ばれます。c++文字列を使用することをお勧めします。
最新のC ++では:
std::string s("Hello world");
for (char & c : s)
{
std::cout << "One character: " << c << "\n";
c = '*';
}
C ++ 98/03の場合:
for (std::string::iterator it = s.begin(), end = s.end(); it != end; ++it)
{
std::cout << "One character: " << *it << "\n";
*it = '*';
}
読み取り専用の反復ではstd::string::const_iterator
、C ++ 98、for (char const & c : s)
またはfor (char c : s)
C ++ 11でのみ使用できます。
auto
常に良い考えです。それを使用する場合は、間の違いbegin()
とはcbegin()
関連になります。
char & c
ですか()?必要な場合に文字値を変更できるようにするだけですか?
const char* str = "abcde";
int len = strlen(str);
for (int i = 0; i < len; i++)
{
char chr = str[i];
//do something....
}
strlen
ループ全体でO(n ^ 2)文字列のサイズ。strlen
ループ中に文字列が変更された場合、ループ条件を呼び出すことができますが、実際に必要な場合のために予約しておく必要があります。
C-string(char []
)の場合は、次のようにする必要があります。
char mystring[] = "My String";
int size = strlen(mystring);
int i;
for(i = 0; i < size; i++) {
char c = mystring[i];
}
以下のためstd::string
に使用できるstr.size()
例のように、そのサイズと反復を取得するには、イテレータを使用することができます。
std::string mystring = "My String";
std::string::iterator it;
for(it = mystring.begin(); it != mystring.end(); it++) {
char c = *it;
}
for (int x = 0; x < yourString.size();x++){
if (yourString[x] == 'a'){
//Do Something
}
if (yourString[x] == 'b'){
//Do Something
}
if (yourString[x] == 'c'){
//Do Something
}
//...........
}
文字列は基本的に文字の配列であるため、文字を取得するためのインデックスを指定できます。インデックスがわからない場合は、上記のコードのようにループできますが、比較を行う場合は、単一引用符(文字を指定する)を使用していることを確認してください。
それ以外は、上記のコードは自明です。
文字列ライブラリのat関数を使用して、文字列のすべての文字を取得できます。
string words;
for (unsigned int i = 0; i < words.length(); i++)
{
if (words.at(i) == ' ')
{
spacecounter++; // to count all the spaces in a string
if (words.at(i + 1) == ' ')
{
i += 1;
}
これは私のコードのほんの一部ですが、ポイントはあなたが文字にアクセスできることです stringname.at(index)
std::string
?