c++ - sirve - con concatenación const char*
concatenar un caracter a una cadena en c (12)
Conectar dos punteros de char constante sin usar el comando strcpy en la asignación dinámica de memoria:
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;
Necesito concatenar dos caracteres de const como estos:
const char *one = "Hello ";
const char *two = "World";
¿Cómo puedo hacer eso?
Me pasaron estos caracteres de una biblioteca de terceros con una interfaz C, así que no puedo usar std::string
lugar.
En primer lugar, debe crear un espacio de memoria dinámico. Entonces puedes poner las dos cuerdas en él. O puede usar la clase c ++ "string". La forma C de la vieja escuela:
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);
Nueva forma C ++
std::string three(one);
three += two;
En su ejemplo, uno y dos son punteros de caracteres, que apuntan a constantes de caracteres. No puede cambiar las constantes de caracteres apuntadas por estos punteros. Entonces algo así como:
strcat(one,two); // append string two to string one.
no trabajará. En su lugar, debe tener una variable separada (matriz de caracteres) para contener el resultado. Algo como esto:
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.
La forma C:
char buf[100];
strcpy(buf, one);
strcat(buf, two);
La forma C ++:
std::string buf(one);
buf.append(two);
La forma de tiempo de compilación:
#define one "hello "
#define two "world"
#define concat(first, second) first second
const char* buf = concat(one, two);
Parece que estás usando C ++ con una biblioteca C y, por lo tanto, debes trabajar con const char *
.
Sugiero envolver esos const char *
en std::string
:
const char *a = "hello ";
const char *b = "world";
std::string c = a;
std::string d = b;
cout << c + d;
Puedes usar strstream
. Está formalmente obsoleto, pero sigue siendo una gran herramienta si necesitas trabajar con cadenas C, creo.
char result[100]; // max size 100
std::ostrstream s(result, sizeof result - 1);
s << one << two << std::ends;
result[99] = ''/0'';
Esto escribirá one
y luego two
en la secuencia, y anexará una terminación /0
usando std::ends
. En caso de que ambas cadenas puedan terminar escribiendo exactamente 99
caracteres, por lo que no quedará espacio para escribir /0
, escribimos uno manualmente en la última posición.
Si no conoce el tamaño de las cadenas, puede hacer algo como esto:
#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;
}
Si usa C ++, ¿por qué no usa std::string
lugar de cadenas estilo C?
std::string one="Hello";
std::string two="World";
std::string three= one+two;
Si necesita pasar esta cadena a una función C, simplemente pase three.c_str()
Un ejemplo más:
// 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;
Pero a menos que específicamente no desee o no pueda usar la biblioteca estándar de C ++, usar std::string
es probablemente más seguro.
Usando std::string
:
#include <string>
std::string result = std::string(one) + std::string(two);
Actualización: string total = string(one) + string(two);
modificada string total = string(one) + string(two);
a string total( string(one) + two );
por razones de rendimiento (evita la construcción de la cadena dos y el total de cadenas temporales)
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()
const char* one = "one";
const char* two = "two";
char result[40];
sprintf(result, "%s%s", one, two);