const char * конкатенация
мне нужно объединить два const символов, как эти:
const char *one = "Hello ";
const char *two = "World";
как я могу это сделать?
Я передал эти char*
S из сторонней библиотеки с интерфейсом C, поэтому я не могу просто использовать std::string
вместо.
12 ответов:
в вашем примере один и два являются указателями char, указывая на константы char. Вы не можете изменить константы char, на которые указывают эти указатели. Так что что-нибудь вроде:
strcat(one,two); // append string two to string one.
не будет работать. Вместо этого вы должны иметь отдельную переменную(массив символов) для хранения результата. Что-то вроде этого:
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()
обновление: изменить
string total = string(one) + string(two);
кstring total( string(one) + two );
по соображениям производительности (избегает построения строки два и временной строки всего)const char *one = "Hello "; const char *two = "World"; string total( string(one) + two ); // OR: string total = string(one) + string(two); // string total(move(move(string(one)) + two)); // even faster? // to use the concatenation in const char* use total.c_str()
еще один пример:
// 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
Это, наверное, безопаснее.
похоже, что вы используете C++ с библиотекой C, и поэтому вам нужно работать с
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;
прежде всего, вы должны создать некоторое динамическое пространство памяти. Тогда вы можете просто strcat две строки в него. Или вы можете использовать класс C++ "string". Старой школы с образом:
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;
можно использовать
strstream
. Это формально устарело, но это все еще отличный инструмент, если вам нужно работать со строками C, я думаю.char result[100]; // max size 100 std::ostrstream s(result, sizeof result - 1); s << one << two << std::ends; result[99] = '';
это
one
а тоtwo
в поток, и добавить окончаниеиспользуя
std::ends
. В случае, если обе строки могут в конечном итоге писать именно99
символы-так что не останется места для записи- мы пишем один вручную в последней позиции.
const char* one = "one"; const char* two = "two"; char result[40]; sprintf(result, "%s%s", one, two);
Если вы не знаете размер строки, вы можете сделать что-то вроде этого:
#include <stdio.h> #include <string.h> #include <stdlib.h> int main(){ const char* q1 = "First String"; const char* q2 = " Second String"; char * qq = (char*) malloc((strlen(q1)+ strlen(q2))*sizeof(char)); strcpy(qq,q1); strcat(qq,q2); printf("%s\n",qq); return 0; }
подключение двух постоянных символов указателя без использования команды strcpy в динамическом выделении памяти:
const char* one = "Hello "; const char* two = "World!"; char* three = new char[strlen(one) + strlen(two) + 1] {''}; strcat_s(three, strlen(one) + 1, one); strcat_s(three, strlen(one) + strlen(two) + 1, two); cout << three << endl; delete[] three; three = nullptr;