Я должен связать две случайных работы константы как они:
const char *one = "Hello ";
const char *two = "World";
Как я мог бы пойти о выполнении этого?
Я встречен они char*
s из сторонней библиотеки с интерфейсом C, таким образом, я не могу просто использовать std::string
вместо этого.
В вашем примере один и два являются указателями на графические константы. Эти указатели не позволяют изменить константы, на которые они указывают. Поэтому ничего подобного:
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.
Способ 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);
Если вы используете C++, почему бы вам не использовать std::string
вместо строк в стиле C?
std::string one="Hello";
std::string two="World";
std::string three= one+two;
Если вам нужно передать эту строку в C-функцию, просто передайте three.c_str()
Используя std::string
:
#include <string>
std::string result = std::string(one) + std::string(two);
Прежде всего, необходимо создать некоторое пространство динамической памяти. Затем в него можно просто записать две строки. Или можно использовать класс 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;
const char* one = "one";
const char* two = "two";
char result[40];
sprintf(result, "%s%s", one, two);
Можно использовать 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
не останется - мы записываем одну строку вручную в последнюю позицию.
Еще один пример:
// 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
, вероятно, безопаснее.
Похоже, что вы используете Си++ с библиотекой Си и поэтому вам необходимо работать с 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;