случайная работа константы* связь

Я должен связать две случайных работы константы как они:

const char *one = "Hello ";
const char *two = "World";

Как я мог бы пойти о выполнении этого?

Я встречен они char*s из сторонней библиотеки с интерфейсом C, таким образом, я не могу просто использовать std::string вместо этого.

108
задан jalf 4 January 2010 в 01:10
поделиться

9 ответов

В вашем примере один и два являются указателями на графические константы. Эти указатели не позволяют изменить константы, на которые они указывают. Поэтому ничего подобного:

strcat(one,two); // append string two to string one.

не сработает. Вместо этого необходимо иметь отдельную переменную(массив char) для хранения результата. Что-то вроде этого:

char result[100];   // array to hold the result.

strcpy(result,one); // copy string one into the result.
strcat(result,two); // append string two to the result.
102
ответ дан 24 November 2019 в 03:28
поделиться

Способ C:

char buf[100];
strcpy(buf, one);
strcat(buf, two);

Способ C++:

std::string buf(one);
buf.append(two);

Способ компиляции:

#define one "hello "
#define two "world"
#define concat(first, second) first second

const char* buf = concat(one, two);
74
ответ дан 24 November 2019 в 03:28
поделиться

Если вы используете C++, почему бы вам не использовать std::string вместо строк в стиле C?

std::string one="Hello";
std::string two="World";

std::string three= one+two;

Если вам нужно передать эту строку в C-функцию, просто передайте three.c_str()

31
ответ дан 24 November 2019 в 03:28
поделиться

Используя std::string:

#include <string>

std::string result = std::string(one) + std::string(two);
20
ответ дан 24 November 2019 в 03:28
поделиться

Прежде всего, необходимо создать некоторое пространство динамической памяти. Затем в него можно просто записать две строки. Или можно использовать класс c++ "string". Способ старой школы C:

  char* catString = malloc(strlen(one)+strlen(two)+1);
  strcpy(catString, one);
  strcat(catString, two);
  // use the string then delete it when you're done.
  free(catString);

Новый способ C++

  std::string three(one);
  three += two;
5
ответ дан 24 November 2019 в 03:28
поделиться
const char* one = "one";
const char* two = "two";
char result[40];
sprintf(result, "%s%s", one, two);
3
ответ дан 24 November 2019 в 03:28
поделиться

Можно использовать strstream . Это формально устарело, но все равно это отличный инструмент, если вам нужно работать со строками на Си, я думаю.

char result[100]; // max size 100
std::ostrstream s(result, sizeof result - 1);

s << one << two << std::ends;
result[99] = '\0';

Это запишет одну , а затем две в поток, и добавит завершающую \0 с помощью std::ends. В случае, если обе строки могут в итоге записать ровно 99 символов - так что пробела при записи \0 не останется - мы записываем одну строку вручную в последнюю позицию.

3
ответ дан 24 November 2019 в 03:28
поделиться

Еще один пример:

// calculate the required buffer size (also accounting for the null terminator):
int bufferSize = strlen(one) + strlen(two) + 1;

// allocate enough memory for the concatenated string:
char* concatString = new char[ bufferSize ];

// copy strings one and two over to the new buffer:
strcpy( concatString, one );
strcat( concatString, two );

...

// delete buffer:
delete[] concatString;

Но если вы специально не хотите или не можете использовать стандартную библиотеку C++, то использование std::string, вероятно, безопаснее.

.
8
ответ дан 24 November 2019 в 03:28
поделиться

Похоже, что вы используете Си++ с библиотекой Си и поэтому вам необходимо работать с const char *.

Предлагаю обернуть эти const char * в std::string:

const char *a = "hello "; 
const char *b = "world"; 
std::string c = a; 
std::string d = b; 
cout << c + d;
5
ответ дан 24 November 2019 в 03:28
поделиться