Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用C++;_C++_String - Fatal编程技术网

C++ 使用C++;

C++ 使用C++;,c++,string,C++,String,例如,我有一个字符串;“llama,goat,cow”我只需要在每个单词前面加一个“@”,这样我的字符串看起来像“@llama,@goat,@cow”,但我需要值也是动态的,并且总是在开头加一个“@”。 不知道大量的C++,有人能帮我找到解决这个问题的最简单的方法吗?非常感谢。这里有一个C++风格的方法: 使用标准库中的基本字符串类: ('string'是basic_string的别名) 您可以使用find_first_of()查找与某个分词分隔符匹配的第一个字符。然后可以使用append运算符

例如,我有一个字符串;“llama,goat,cow”我只需要在每个单词前面加一个“@”,这样我的字符串看起来像“@llama,@goat,@cow”,但我需要值也是动态的,并且总是在开头加一个“@”。
不知道大量的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() );
}