Конкатенация строк указывает на другой строковый указатель C ++ - PullRequest
1 голос
/ 30 марта 2011

Привет всем, у меня есть следующая строка:

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

где firstName, lastName, playernumber, pointTotal - все строковые указатели.

Как я могу собрать их все вместе в другом указателе строки?Компилятор жалуется на мою строку кода.

Извините, я не очень хорошо разбираюсь в C ++. Я пришел из Java-фона.

Ответы [ 6 ]

8 голосов
/ 30 марта 2011

Используйте меньше указателей. Это сработало бы, если бы все ваши переменные были просто строками. Но так как вы говорите, у вас есть указатели:

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

Одной из первых привычек, которую вы должны сломать при переходе с Java на C ++, является создание всех ваших объектов с new. В C ++ new не для создания объектов, а для выделения памяти. В любое время вы можете использовать локальную переменную вместо динамического размещения, вы должны. А когда вы не можете, попробуйте позволить некоторому объекту, предоставленному библиотекой, например std::vector, позаботиться о выделении и освобождении за вас.

2 голосов
/ 30 марта 2011

Для того, чтобы собрать кучу частей, как это, я бы использовал поток строк, что-то вроде этого:

std::ostringstream buffer;
buffer << "Name: " << firstName << " " << lastName << "\n"
       << "Number: " << playerNumber << "\n"
       << "Points: " << pointTotal << "\n";

std::string PlayerInfo = buffer.str();
1 голос
/ 30 марта 2011

Вы, вероятно, хотите просто:

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);
1 голос
/ 30 марта 2011

Проблема с Java-фоном.

Вы не можете сделать это в C ++. Указатели указывают на места в памяти. Они находятся в разных местах, поэтому вы не можете просто объединить их.

Почему вы используете строковые указатели? Вы можете запутаться между char * указателями и string, которые находятся в 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.


0 голосов
/ 25 сентября 2014

Поскольку вы попросили решить вашу проблему с помощью указателей, вот код для начальной школы:

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
}
0 голосов
/ 28 ноября 2013

как ответ г-на Коффина с использованием «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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...