【问题标题】:convert char to string in c++在 C++ 中将 char 转换为字符串
【发布时间】:2015-12-14 14:46:41
【问题描述】:

我试图通过将字符串提供给函数来减少它。例如,如果我有"abrakadabra",该函数将返回一个字符串"abrkd"。这意味着所有字符在返回值中应该只存在一次。

我有以下功能:

string textletters(string text) {
    string ret = "";
    for (unsigned i = 0; i < text.length(); i++) {
        if (i == 0) {
            ret += str;
        } else {
            bool exist = false;
            for (unsigned j = 0; j < i; j++) {
                if (text.at(i) == text.at(j) {
                    exist = true;
                }
            }
            if (!exist) {
                ret += str;
            }
        }
    }
    return ret;
}

我知道text.at(i) 会返回char。但我想将此char 转换为string,以便将其连接起来。

【问题讨论】:

  • 您不必这样做。 std::string 的操作符+= 可以附加一个char 就好了。
  • @Boumbles 不是那个问题的骗子,但可能仍然是一个骗子。
  • 访问text 内容的代码处于循环中,通过有效索引运行到text。无需在该循环内检查 text.at(i) 的有效性。只需使用text[i]

标签: c++ string char


【解决方案1】:

使用push_back 方法将单个字符附加到std::string。您也可以使用operator += 来执行此操作。

【讨论】:

    【解决方案2】:

    我提出另一种方法:

    C++ 带有很多容器逻辑。

    您可以将字符串转换为set,这样每个值只允许一个元素:

    #include <set>
    #include <algorithm>
    
    std::string input("akrakadabra");
    std::set<char> only_once(input.begin(), input.end());
    

    这样做的缺点是字母是在之后排序的,而不是按照字符串中第一次出现的顺序,但是您没有指定是否需要特定的顺序。

    您也可以使用范围构造函数将set 转换回string

    std::string result(only_once.begin(), only_once.end());
    

    或类似的。

    【讨论】:

      【解决方案3】:

      通常使用std::stringstream

      #include <sstream>
      ...
      std::stringstr ss;
      ...
      ss << text.at(i);
      ...
      std::string result = ss.str();
      

      【讨论】:

        【解决方案4】:

        只是回答名义上的问题,正如其他人所指出的那样,实际上对这个问题没有用:

        有一个std::string 构造函数,它接受一个字符和一个重复计数。因此,要创建由单个字符组成的字符串,可以使用重复计数 1:

        string(1, ch)
        

        但这非常浪费,即使在具有小字符串优化的实现上也是如此。因此,正如 Andrew 在他的回答中建议的那样,只需将您的角色直接附加到您现有的字符串中即可。

        【讨论】:

          【解决方案5】:

          暗示返回的字符序列应该具有原始顺序的字符,但如果这不是实际要求,那么解决方案很简单:

          std::string res = text;
          std::sort(res.begin(), res.end());
          auto last = std::unique(res.begin(), res.end());
          res.erase(last, res.end());
          return res;
          

          【讨论】:

            【解决方案6】:

            我需要复习我的 C++ 课程,但目前,我只能通过 VisualBasic 代码示例帮助您,它可能会给您带来一个新的想法来实现它,检查我做了什么:

            Option Explicit
            Public Function DeleteRepeated(Text As String) As String
            Dim length, i As Integer
            length = Len(Text)
            Dim NewText, Char As String
            NewText = ""
            For i = 1 To length
            Char = Mid(Text, i, 1)
            If InStr(1, NewText, Char, vbTextCompare) = 0 Then
            NewText = NewText & Char
            End If
            Next i
            DeleteRepeated = NewText
            End Function
            

            这是您正在寻找的内容,现在按照您的要求使用 C++,如果您有任何问题,请告诉我,希望对您有所帮助:

            // Delete Repeated Char in String
            #include <iostream>
            #include <string>
            using namespace std;
            
            string UniqueInString (string MyString)
            {
              string chr,NewText;
                for (unsigned i=0; i<MyString.length(); ++i)
                {
                chr = MyString.at(i);
                if (NewText.find(chr) == string::npos)
                {
                NewText = NewText + chr;
                }
                }
              return NewText;
            }
            
            int main ()
            {
              string z = "abrakadabra";
              cout<< UniqueInString(z);
            }
            

            【讨论】:

              【解决方案7】:

              这里是 lambda 解决方案:

                string res = "abrakadabra";
              
                res.erase(remove_if(res.begin(), res.end(), [&res](const char& c)
                { return find(res.c_str(), &c, c) != &c; }), res.end());
              
                cout << res << "\n";
              

              输出:abrkd

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2018-03-27
                • 2013-05-13
                • 2012-01-16
                • 2018-09-02
                • 1970-01-01
                • 2010-11-22
                • 1970-01-01
                • 2012-03-07
                相关资源
                最近更新 更多