Возможна ли арифметика указателей с классом строк C ++? - PullRequest
1 голос
/ 27 февраля 2011

После программирования немного на CI решил перейти прямо в C ++.Сначала я был рад присутствию класса string и возможности обрабатывать строки как целые единицы вместо массивов символов.Но вскоре я обнаружил, что строки в стиле C имеют преимущество, заключающееся в том, что программа позволяет перемещаться по ней посимвольно, используя арифметику указателей, и выполнять желаемую логическую операцию.

Я сейчас попал в ситуацию, которая требует этого, но компилятор говорит мне, что он не может преобразовать строку типа в строки стиля C.Поэтому мне было интересно, есть ли способ использовать арифметику указателей для ссылки на отдельные символы или для передачи аргументов функции в качестве адреса первого символа, при этом все еще используя строковый класс без необходимости создавать массивы символов, или я просто хочуесть мой торт и есть его тоже?

Ответы [ 2 ]

4 голосов
/ 27 февраля 2011

строковые символы могут быть доступны по индексу, указателям и с помощью итераторов.

если вы хотите использовать итераторы, вы можете создать функцию, которая проверяет, есть ли в строке пробел или нет:

bool spacecheck(const string& s)
{
    string::const_iterator iter = s.begin();
    while(iter != s.end()){
        if (isspace(*iter))
            return true;
        else
            ++iter;
    }
}

В начале функции я инициализировал итератор для начала строки s , используя функцию .begin () , котораяв этом случае возвращает итератор к первому символу в строке.В функции while условие: iter ! = s.end () .В этом случае end () возвращает в итераторе ссылку на элемент после последнего символа строки.В теле (* iter) , то есть значение, на которое указывает iter, отправляется функции isspace () , которая проверяет, является ли символ пробелом.Если это не удается, iter увеличивается, что делает его указателем на следующий элемент строки.

Я сам изучаю c ++ и, выписывая все это, это помогло моему пониманию некоторых.Надеюсь, я вас не обидел, если вам все это показалось очень простым, я просто пытался быть кратким.

В настоящее время я учусь на Accelerated c ++ и не могу рекомендовать это достаточно высоко!

4 голосов
/ 27 февраля 2011

Вы можете использовать &your_string[0], чтобы получить указатель на начальный символ в строке. Вы также можете использовать your_string.begin(), чтобы получить итератор в строку, которую вы можете обрабатывать почти как указатель (разыменовать его, выполнить арифметику и т. Д.)

Возможно, вам лучше рассказать нам больше о том, чего вы пытаетесь достичь. Скорее всего, есть хороший способ сделать это, чем с указателем.

Редактировать: Для подсчета количества гласных в строке вы почти наверняка захотите использовать алгоритм - в этом случае, вероятно, наиболее подходящим будет std::count_if:

struct is_vowel {
    bool operator()(char ch) { 
        static const char vowels[] = "aeiouAEIOU";
        return strchr(vowels, ch) != NULL;
    }
};

int vowels = std::count_if(my_string.begin(), my_string.end(), is_vowel());

Мы все еще используем begin(), но не делаем никакой арифметики с указателями (*).

...