使用C ++在字符串中的每个单词前面插入字符

时间:2010-03-27 01:22:48

标签: c++ string

我有一个字符串,例如; “骆驼,山羊,牛”,我只需要在每个单词前放一个'@',这样我的字符串看起来就像“@ llama,@ goat,@ cow”,但我还需要这些值是动态的,并且在开头总是带着'@'。 不知道大量的C ++有人可以帮我找到解决这个问题的最简单方法吗?非常感谢提前。

3 个答案:

答案 0 :(得分:4)

目前,我将假设这些单词总是用逗号分隔。如果这是正确的,这样的事情至少应该相当接近:

// 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>

答案 1 :(得分:2)

这是一种C ++风格的方式:

使用标准库中的basic_string类: basic_string ('string'是basic_string的别名) 您可以使用find_first_of()查找与您的一个wordbreak分隔符匹配的第一个字符。然后,您可以使用append运算符(+ =)将字符串的段附加到新字符串,然后在其间添加“@”符号。

这是一种C风格的方式:

您可以从strtok_s

开始

通过搜索逗号或空格等分词分隔符来“标记”字符串。然后,您就可以将分隔符之间的部分复制到另一个缓冲区中,然后在它们之间放置“@”符号

为此,我使用strcpy_s逐个复制到新的缓冲区。

答案 2 :(得分:1)

根据可插入的评论判断,(s?)他正试图让这段代码正常工作......所以让我提出我的看法......

与其他人一样,我假设每个单词都由一个单词“,”分隔。如果你可以有多个字符分隔符,你需要添加第二个查找(即find_first_not_of)来查找每个单词的开头/结尾。

是的,您可以将'@'字符插入预先存在的字符串中。但是除非你聪明,否则为每个单词插入会产生一些低效率(O(N ^ 2))。这种聪明之处通常伴随着高昂的维护/调试成本。所以我会坚持使用两个字符串...

(使用STL算法应该有一些很棒的方法。但我生病了,我现在还没看到如何适应插入......)

参考文献:C++-strings C++-strings 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() );
}