【问题标题】:Concatenate string points into another string pointer C++将字符串点连接到另一个字符串指针 C++
【发布时间】:2011-03-30 02:27:34
【问题描述】:

大家好,我有以下一行:

string* playerInfo = "Name: " + firstName + " " + lastName + "\n" +
                        "Number: " + playerNumber + "\n" +
                        "Points: " + pointTotal + "\n";

其中 firstName、lastName、playernumber、pointTotal 都是字符串指针。

如何将它们全部放在另一个字符串指针中?编译器抱怨我的代码行。

抱歉,我来自 Java 背景,我不擅长 C++。

【问题讨论】:

  • “抱歉,我不擅长 C++,我来自 Java 背景。”不过,这并不重要,因为无论如何你都应该从头开始学习 C++。查看good book 并忘记您了解 Java;将相似之处视为巧合。
  • 不清楚是string pointers C 字符串还是std::string

标签: c++ pointers string-concatenation


【解决方案1】:

使用更少的指针。如果您所有的变量都只是字符串,那将会起作用。但是既然你说你有指针:

string playerInfo = "Name: " + *firstName + " " + *lastName + "\n" +
                    "Number: " + *playerNumber + "\n" +
                    "Points: " + *pointTotal + "\n";

从 Java 迁移到 C++ 时应打破的第一个习惯是使用 new 创建所有对象。在 C++ 中,new 不是用于创建对象,而是用于内存分配。任何时候您都可以使用局部变量而不是动态分配,您应该这样做。如果不能,请尝试让诸如 std::vector 之类的库提供的对象为您处理分配和释放。

【讨论】:

    【解决方案2】:

    为了像这样将一堆片段放在一起,我会使用字符串流,如下所示:

    std::ostringstream buffer;
    buffer << "Name: " << firstName << " " << lastName << "\n"
           << "Number: " << playerNumber << "\n"
           << "Points: " << pointTotal << "\n";
    
    std::string PlayerInfo = buffer.str();
    

    【讨论】:

      【解决方案3】:

      Java 背景是问题。

      你不能在 C++ 中做到这一点。指针指向内存中的位置。它们位于不同的位置,因此您不能将它们串联起来。

      为什么要使用字符串指针?你可能会混淆char * 指针和string 哪个is in the STL

      您可能只想使用不带指针的字符串。你可以这样做:

      string str;
      str.append("Name: ");
      str.append(firstname);
      // ...
      

      您也可以使用 +=。

      string str;
      str += " ";
      str += lastname;
      

      但这很令人困惑,因为你不能这样做:

      string str;
      str += " " + " Name: "; // WRONG!
      

      但你可以这样做:

      string str;
      string str2;
      str = "Name: " + str2; // OK
      

      所以我只是避免使用运算符 + 并使用 .append。


      【讨论】:

      • std::string 重载operator +,因此您可以将它们连接起来。只要至少一个参数是真正的string 对象,就是这样。
      • 你确定吗?我认为它只是 +=...(编辑没关系,测试它,它有效)
      • @bo:是的,他是对的。一个常见的错误可能是:const char* cstr = "asd"; std::string s = cstr + "123";。在这里,这种运算符重载不会起作用,因为 cstr"123" 都不是 std::string 的。
      【解决方案4】:

      你可能只想:

      std::string playerInfo = std::string("Name: ") + firstName + " " + lastName + "\n" +
                      "Number: " + playerNumber + "\n" +
                      "Points: " + pointTotal + "\n";
      

      "Name" 放入std::string,然后创建一系列operator+() 调用,这些调用依次产生串联。

      您可能并不需要将 playerInfo 放在堆上,但如果需要,您可以:

      std::string* pOnHeap = new std::string(playerInfo);
      

      【讨论】:

      • 不要告诉他新的,他会认为他又回到了Java!
      【解决方案5】:

      就像科芬先生使用“stringstream”的回答:

      #include <iostream>
      #include <sstream>
      using namespace std;
      
      stringstream buffer;     
      buffer << "Name: " << firstName << " " << lastName << "\n"
             << "Number: " << playerNumber << "\n"
             << "Points: " << pointTotal << "\n";
      
      cout << buffer.str() << endl;
      

      【讨论】:

        【解决方案6】:

        正如您要求通过使用指针来解决您的问题,这里是一个小学代码解决方案:

        int StringLength(const char * s){
        int l = 0;
        while (*s++) l++;
        return l;
        }
        
        char *StrCat(const char * str1, const char *str2){
          int len1 = StringLength(str1);
          int len2 = StringLength(str2);
          int totLen = len1 + len2 + 1;
        
          char * str12 = (char *)malloc((totLen)*sizeof(char));
          memset(str12, '\0', totLen);
        
          for (int i = 0; i < len1; i++)
            *(str12 + i) = *(str1 + i);
          for (int i = 0; i < len2; i++)
            *(str12 + i + len1) = *(str2 + i);
        
          return str12;
        }
        
        int main(int argc, char *argv[]){
          char * S1= "ABCDE";
          char * S2= "FGH";
        
          char *S12 = NULL;
          S12 = StrCat(S1, S2);
          cout << "S12= "<< S12 << endl; // ABCDEFGH
        }
        

        【讨论】:

          猜你喜欢
          • 2011-09-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-18
          相关资源
          最近更新 更多