Const char * конкатенация
Мне нужно объединить два символа const, подобные этим:
const char *one = "Hello ";
const char *two = "World";
Как я могу это сделать?
Я передал эти char*
из сторонней библиотеки с интерфейсом C, поэтому я не могу просто использовать std::string
вместо этого.
Ответы
Ответ 1
В вашем примере один и два являются указателями char, указывая на константы char. Вы не можете изменить константы char, на которые указывают эти указатели. Итак, что угодно:
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.
Ответ 2
Путь C:
char buf[100];
strcpy(buf, one);
strcat(buf, two);
Способ С++:
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);
Ответ 3
Если вы используете С++, почему бы вам не использовать std::string
вместо строк C-стиля?
std::string one="Hello";
std::string two="World";
std::string three= one+two;
Если вам нужно передать эту строку в C-функцию, просто передайте three.c_str()
Ответ 4
Использование std::string
:
#include <string>
std::string result = std::string(one) + std::string(two);
Ответ 5
Обновление: изменено string total = string(one) + string(two);
до string total( string(one) + two );
по соображениям производительности (избегает построения строки 2 и общей временной строки)
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()
Ответ 6
Еще один пример:
// 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;
Но если вы специально не хотите или не можете использовать стандартную библиотеку С++, использование std::string
, вероятно, безопаснее.
Ответ 7
Прежде всего, вам нужно создать некоторое пространство динамической памяти. Тогда вы можете просто вставить две строки в нее. Или вы можете использовать класс "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);
Новый способ С++
std::string three(one);
three += two;
Ответ 8
Кажется, что вы используете С++ с библиотекой 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;
Ответ 9
Если вы не знаете размер строк, вы можете сделать что-то вроде этого:
#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;
}
Ответ 10
Вы можете использовать strstream
. Он формально устарел, но он по-прежнему отличный инструмент, если вам нужно работать со строками C. Я думаю.
char result[100]; // max size 100
std::ostrstream s(result, sizeof result - 1);
s << one << two << std::ends;
result[99] = '\0';
Это напишет one
, а затем two
в поток и добавит завершающий \0
с помощью std::ends
. В случае, если обе строки могут записать ровно 99
символов, поэтому оставить пробел в тексте \0
- мы записываем его вручную в последнюю позицию.
Ответ 11
const char* one = "one";
const char* two = "two";
char result[40];
sprintf(result, "%s%s", one, two);
Ответ 12
Подключение двух константных указателей char без использования команды strcpy в динамическом распределении памяти:
const char* one = "Hello ";
const char* two = "World!";
char* three = new char[strlen(one) + strlen(two) + 1] {'\0'};
strcat_s(three, strlen(one) + 1, one);
strcat_s(three, strlen(one) + strlen(two) + 1, two);
cout << three << endl;
delete[] three;
three = nullptr;
Ответ 13
Я использую C++, но есть функция C; Итак, как мне объединить две строки и сделать их const char *, чтобы передать функцию, которая получает const char *?
myFunc(const char*); // prototype
myFunc("str1"+"str2"); // this gives error
// l'd like to avoid the use of another container
Я пытался сделать кастинг, но не получилось