Судя по комментариям вставляемым , (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() );
}