C++ 使用C++;
例如,我有一个字符串;“llama,goat,cow”我只需要在每个单词前面加一个“@”,这样我的字符串看起来像“@llama,@goat,@cow”,但我需要值也是动态的,并且总是在开头加一个“@”。C++ 使用C++;,c++,string,C++,String,例如,我有一个字符串;“llama,goat,cow”我只需要在每个单词前面加一个“@”,这样我的字符串看起来像“@llama,@goat,@cow”,但我需要值也是动态的,并且总是在开头加一个“@”。 不知道大量的C++,有人能帮我找到解决这个问题的最简单的方法吗?非常感谢。这里有一个C++风格的方法: 使用标准库中的基本字符串类: ('string'是basic_string的别名) 您可以使用find_first_of()查找与某个分词分隔符匹配的第一个字符。然后可以使用append运算符
不知道大量的C++,有人能帮我找到解决这个问题的最简单的方法吗?非常感谢。这里有一个C++风格的方法: 使用标准库中的基本字符串类: ('string'是basic_string的别名) 您可以使用find_first_of()查找与某个分词分隔符匹配的第一个字符。然后可以使用append运算符(+=)将字符串的段附加到新字符串,然后在其间附加“@”符号 这里有一种C风格的方式: 你可以从 它将通过搜索逗号或空格等分词分隔符来“标记”字符串。然后,您可以将分隔符之间的部分复制到另一个缓冲区中,然后在继续操作时在它们之间放置“@”符号
为此,我将使用逐段复制到一个新的缓冲区。目前,我将假设单词总是用逗号分隔。如果这是正确的,那么像这样的事情至少应该相当接近:
// 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;
//警告:未测试。
字符串输入(“骆驼、山羊、奶牛”);
std::ostringstream o;
字符串字;
std::istringstream i(输入);
while(std::getline(输入,单词','))
o根据insertable的评论判断,(s?)他正试图让这段代码正常工作。。。所以让我提出我的看法
和其他单词一样,我假设每个单词都由一个“,”分隔。如果可以有多个字符分隔符,则需要添加第二个查找(即find_first_not_of)来查找每个单词的开始/结束
是的,您可以将“@”字符插入到先前存在的字符串中。但是,除非你很聪明,否则每个单词的插入都会有点低效(O(N^2))。这种聪明通常伴随着高昂的维护/调试成本。所以我会坚持使用两个字符串
(STL算法应该有一些很好的方法来实现这一点。但是我病了,我现在不知道如何适应插入…)
参考资料:
#包括
#包括
#包括
使用名称空间std;
#define SHOW(X)cout这段代码看起来很有趣,但我得到了一个错误:llama.cpp:15:错误:调用“getline(std::string&,std::string&,char)”时没有匹配的函数——知道这意味着什么吗?感谢从std::getline中删除std::之后,我收到了以下错误:llama.cpp:15:错误:无法将参数“1”的“std::string”转换为“char**”,将参数“1”转换为“\uu ssize\u t getline(char**,size\u t*,FILE*)”。我喜欢您的cpp文件名为“llama.cpp”的事实!这很好用,谢谢你,也谢谢你的参考资料。我也很感谢德鲁和杰瑞的建议。
#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() );
}