Для каждого символа в строке - PullRequest
200 голосов
/ 25 февраля 2012

Как бы я сделал цикл for для каждого символа в строке в C ++?

Ответы [ 9 ]

368 голосов
/ 25 февраля 2012
  1. Цикл по символам из std::string с использованием цикла for на основе диапазона (он из C ++ 11, уже поддерживается в последних выпусках GCC, clang и VC11 бета):

    std::string str = ???;
    for(char& c : str) {
        do_things_with(c);
    }
    
  2. Цикл по символам std::string с итераторами:

    std::string str = ???;
    for(std::string::iterator it = str.begin(); it != str.end(); ++it) {
        do_things_with(*it);
    }
    
  3. Цикл по символам std::string со старомодным циклом for:

    std::string str = ???;
    for(std::string::size_type i = 0; i < str.size(); ++i) {
        do_things_with(str[i]);
    }
    
  4. Цикл по символам массива символов с нулевым символом в конце:

    char* str = ???;
    for(char* it = str; *it; ++it) {
        do_things_with(*it);
    }
    
27 голосов
/ 25 февраля 2012

Цикл 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];
}

В основном, два выше - это два типа строк, поддерживаемых c ++. Второй называется строкой c, а первый называется строкой std или (строкой c ++). Я бы предложил использовать строку c ++, что очень легко для обработки.

24 голосов
/ 25 февраля 2012

В современном C ++:

std::string s("Hello world");

for (char & c : s)
{
    std::cout << "One character: " << c << "\n";
    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.

9 голосов
/ 13 сентября 2017

Вот еще один способ сделать это, используя стандартный алгоритм.

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

int main()
{
   std::string name = "some string";
   std::for_each(name.begin(), name.end(), [] (char c) {
      std::cout << c;
   });
}
7 голосов
/ 25 февраля 2012
const char* str = "abcde";
int len = strlen(str);
for (int i = 0; i < len; i++)
{
    char chr = str[i];
    //do something....
}
3 голосов
/ 30 ноября 2017

Я не вижу примеров использования диапазона, основанного на цикле for со строкой "c".

char cs[] = "This is a c string\u0031 \x32 3";

// range based for loop does not print '\n'
for (char& c : cs) {
    printf("%c", c);
}

не связано, но пример массива int

int ia[] = {1,2,3,4,5,6};

for (int& i : ia) {
    printf("%d", i);
}
1 голос
/ 10 октября 2015
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
        }
        //...........
    }

Строка - это в основном массив символов, поэтому вы можете указать индекс для получения символа.Если вы не знаете индекс, вы можете просмотреть его, как в приведенном выше коде, но когда вы проводите сравнение, убедитесь, что вы используете одинарные кавычки (которые указывают символ).

Кромечто приведенный выше код не требует пояснений.

1 голос
/ 25 февраля 2012

Для C-строки (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;
}
0 голосов
/ 08 июня 2016

вы можете получить каждый символ в строке, используя функцию 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)

...