Блог пользователя PashaChemerys

Автор PashaChemerys, 11 лет назад, По-русски

Всем привет! Недавно я начал учить С++ (до этого писал на Pascal). И теперь, меня интересует вопрос " Какие есть функции, обрабатывающие строки, и какие для них нужно подключать библиотеки? "

  • Проголосовать: нравится
  • +5
  • Проголосовать: не нравится

»
11 лет назад, # |
Rev. 3   Проголосовать: нравится -26 Проголосовать: не нравится

»
11 лет назад, # |
Rev. 4   Проголосовать: нравится +3 Проголосовать: не нравится

В С нет строк в паскалевском понимании. Классические Сишные строки — это массывы символов, которые заканчиваются 0 — символом конца строки. Функции для работы с такими строками есть в string.h. В С++ же существует класс string, для работы с которым есть библиотека string, которая расположена в пространстве имен std, то есть функции следует вызывать либо через std::, либо указывать директиву using namespace std;

  • »
    »
    11 лет назад, # ^ |
      Проголосовать: нравится +7 Проголосовать: не нравится

    Спасибо за ответ! А какие именно есть функции?

    • »
      »
      »
      11 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Если для сишных ASCII — строк, которые задаются как char *, то,например, strcpy, strcat, strcmp и подбные им, которые позволяют копировать, конкатенировать, сравнивать строки и т.п. Для класса string для добавления/сравнения перегружены стандартные операторы +,+=,== плюс имеются методы, определения длины строки, по строке можно проходиться итератором, в общем все методы класса, обращение к ним делается в виде string b; b+="abcd"; int a=b.length();

    • »
      »
      »
      11 лет назад, # ^ |
        Проголосовать: нравится +1 Проголосовать: не нравится

      Пишу по памяти, что сразу приходит на ум: string s;

      s.find ("substr"); — поиск подстроки

      x = atoi(s.c_str()); — преобразование строки к числу типа int (s.c_str() указатель на массив char'ов)

      sscanf (s.c_str(),"%lf",&x); — преобразование строки к типу double

      s.erase (s.being () + n); — удаление n-того символа(с нуля), также у этого метода есть перегруженные варианты

      reverse(s.begin(),s.end()); — перевернуть строку

      sort(s.begin(),s.end()); — отсортировать символы в строке

      s += s; s += string("test");- конкатенация

      cout << s; — вывод строки

      s.push_back (ch); — вставка символа ch типа char в конец строки

      s.pop_back(); — удаление последнего сивола

      s.clear(); — отчистка строки

      s.resize(len); — зарезервировать место под строку (для того,чтобы не перевыделялась память при посимвольной вставке)

      ...и еще что-то есть.

      • »
        »
        »
        »
        11 лет назад, # ^ |
          Проголосовать: нравится +1 Проголосовать: не нравится

        Это .reserve() резервирует место под будущие вставки, а вот .resize() сразу увеличивает длину строки до указанного количества символов.

        Преобразовывать строку во что угодно в стиле C++ удобно и так:

        istringstream iss(s);
        
        int x; // или double и т.д.
        
        iss >> x;
»
11 лет назад, # |
  Проголосовать: нравится +9 Проголосовать: не нравится

Подробнее читай здесь: http://www.cplusplus.com/reference/string/string/

  • »
    »
    11 лет назад, # ^ |
      Проголосовать: нравится -12 Проголосовать: не нравится

    Подробнее всего читать MSDN=) Он, как бы, для того и создан, чтобы содержать всю необходимую информацию обо всех функциях. Cтавится вместе с Visual Studio. Еще есть сайт http://msdn.microsoft.com/ . Если нужен именно класс string, вот ссылка http://msdn.microsoft.com/ru-ru/library/system.string.aspx . Правда, откровенно говоря, кроме операций =,+=,+,==,[] и length(), больше ничего не понадобится, по крайней мере для олимпиадного программировния.

    • »
      »
      »
      11 лет назад, # ^ |
        Проголосовать: нравится +23 Проголосовать: не нравится

      C++ != Visual Studio

      • »
        »
        »
        »
        11 лет назад, # ^ |
          Проголосовать: нравится -11 Проголосовать: не нравится

        Никто и не предлагает читать про Visual Basic, .Net или C#. Но функции C++ в MSDN очень подробно описаны и там много хороших примеров их применения.

        • »
          »
          »
          »
          »
          11 лет назад, # ^ |
          Rev. 2   Проголосовать: нравится +8 Проголосовать: не нравится

          На мой взгляд, cplusplus.com лучше подходит для того, чтобы узнать, какие методы у каких классов есть, он, кажется, больше ориентирован на стандарт языка.

          Простой пример — есть класс std::exception. По стандарту(и в gnu компиляторе, если я не ошибаюсь) у него нет конструктора от std::string, а в компиляторе visual studio(и на сайте msdn) он есть.

          Таким образом, читая msdn можно нарваться на необычную ошибку(выбрав неправильный компилятор) "у меня всё работает, отправляю решение в тестирующую систему и там compilation error:("

          UPD: К вопросу про полезные функции. Мне ещё часто пригождается std::string::substr, чтобы выделить какую-то подстроку.

  • »
    »
    11 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Или здесь.

»
11 лет назад, # |
  Проголосовать: нравится -12 Проголосовать: не нравится

Недавно я начал учить С++ (до этого писал на Pascal).

Воу-воу, полегче.