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