Вставить символ перед каждым словом в строке, используя C ++ - PullRequest
3 голосов
/ 27 марта 2010

У меня есть строка, например; «llama, goat, cow», и мне просто нужно поставить «@» перед каждым словом, чтобы моя строка выглядела как «@ llama, @ goat, @ cow», но мне нужно, чтобы значения также были динамическими, и всегда с '@' в начале. Не зная большого количества C ++, может кто-нибудь помочь мне найти самое простое решение этой проблемы? Большое спасибо заранее.

Ответы [ 3 ]

4 голосов
/ 27 марта 2010

На данный момент я собираюсь предположить, что слова всегда разделены запятыми. Если это правильно, то что-то вроде этого должно быть по крайней мере довольно близко:

// warning: untested.
std::string input("llama,goat,cow");
std::ostringstream o;

std::string word;

std::istringstream i(input);
while (std::getline(input, word, ','))
    o << "@" << word << ",";

std::string result(o.str(), o.str().size()-1);

// show the result:
std::cout << result;

Редактировать: есть две разные функции с именем getline: одна является членом iostream и считывает входные данные в «сырой» массив char Другая - глобальная свободная функция, которая считывает входные данные в std::string. Это тот, который вы хотите. Чтобы объявить это, вы должны #include <string>.

2 голосов
/ 27 марта 2010

Вот способ в стиле C ++:

Используйте класс basic_string в стандартной библиотеке: basic_string ('string' является псевдонимом для basic_string) Вы можете использовать find_first_of (), чтобы найти первый символ, который соответствует одному из ваших разделителей слов. Затем вы можете использовать оператор добавления (+ =), чтобы добавить сегменты строки к новой строке, а затем добавить символы «@» между ними.

Вот способ в стиле C:

Вы можете начать с strtok_s

Который будет "токенизировать" строку путем поиска разделителей слов, таких как запятые или пробелы. После этого вы сможете скопировать части между разделителями в другой буфер, а затем поместить символы '@' между ними по мере продвижения

Для этого я бы использовал strcpy_s , чтобы копировать по частям в новый буфер.

1 голос
/ 27 марта 2010

Судя по комментариям вставляемым , (s?) он пытается заставить этот код работать ... Итак, позвольте мне предложить мой вариант ...

Как и в случае с другими, я предполагаю, что каждое слово отделяется одним ",". Если у вас может быть несколько разделителей символов, вам нужно добавить второй поиск (т.е. find_first_not_of), чтобы найти начало / конец каждого слова.

И да, вы можете вставить символы '@' в существующую строку. Но вставка для каждого слова становится немного неэффективной (O (N ^ 2)), если вы не умны. Такая хитрость обычно сопровождается высокой стоимостью обслуживания / отладки. Так что я просто буду использовать две строки ...

(Должен быть какой-то блестящий способ сделать это с помощью алгоритмов STL. Но я болен, и я просто не вижу, как приспособить вставку прямо сейчас ...)

Ссылки: C ++ - строки C ++ - строки STL count_if

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

#define SHOW(X)  cout << # X " = " << (X) << endl

int main()
{
             //     0123456789_123456789_1234
  string  inString(",llama,goat,cow,,dog,cat");
  string  outString;

/* This code assumes inString.size() > 0 */

  const iterator_traits<string::iterator>::difference_type  numberOfWords
    = count_if( inString.begin(), inString.end(),
                bind2nd( equal_to<char>(), ',' ) )
       + 1;

  string::size_type  startIndex, endIndex;


  outString.reserve( inString.length() + numberOfWords );


  for ( startIndex = endIndex = 0;
        endIndex != string::npos;
        startIndex = endIndex + 1 )
  {
    outString += "@";

      /* No startIndex+1 here.  We set startIndex=endIndex+1 in the for loop */
    endIndex = inString . find_first_of( ",", startIndex );

    outString . append ( inString, startIndex,
                         (   (endIndex == string::npos)
                           ? string::npos : endIndex - startIndex + 1) );
  }

  SHOW( numberOfWords );
  SHOW( inString );
  SHOW( outString );
  SHOW( inString.size() );
  SHOW( outString.size() );
  SHOW( inString.capacity() );
  SHOW( outString.capacity() );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...