Вопрос:

Возможна ли арифметика указателей с классом строк C ++?

c++ arrays class string pointer-arithmetic

1849 просмотра

2 ответа

171 Репутация автора

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

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

Автор: Steve S Источник Размещён: 26.02.2011 09:55

Ответы (2)


4 плюса

402510 Репутация автора

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

Автор: Jerry Coffin Размещён: 26.02.2011 10:00

4 плюса

175 Репутация автора

Решение

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

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

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 увеличивается, что указывает на следующий элемент строки.

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

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

Автор: James Размещён: 26.02.2011 10:34
Вопросы из категории :
32x32