Domanda

Ho bisogno di concatenare due caratteri const come questi:

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

Come potrei fare per fare che?

sono passato questi char*s da una libreria di terze parti con un'interfaccia C, quindi non posso usare semplicemente std::string posto.

È stato utile?

Soluzione

Nel tuo esempio una e due sono puntatori char, puntando a char costanti. Non è possibile modificare le costanti char puntato da questi puntatori. Quindi nulla di simile:

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

non funzionerà. Invece si dovrebbe avere una variabile indipendente (array di caratteri) per contenere il risultato. Qualcosa di simile a questo:

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.

Altri suggerimenti

Il modo C:

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

Il modo in C ++:

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

Il modo in fase di compilazione:

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

const char* buf = concat(one, two);

Se si utilizza C ++, perché non si utilizza std::string invece di stringhe in stile C?

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

std::string three= one+two;

Se è necessario passare questa stringa a un C-funzione, è sufficiente passare three.c_str()

Utilizzando std::string:

#include <string>

std::string result = std::string(one) + std::string(two);

Aggiornamento: è cambiato     string total = string(one) + string(two); per string total( string(one) + two ); per motivi di prestazioni (evita costruzione di stringa a due e totale stringa temporanea)

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()

Un altro esempio:

// 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;

Ma se non specificatamente non si vuole o non può utilizzare la libreria standard C ++, utilizzando std::string è probabilmente più sicuro.

Sembra che si sta utilizzando C ++ con una libreria C e pertanto è necessario lavorare con const char *.

Suggerisco avvolgendo quelle const char * in std::string:

const char *a = "hello "; 
const char *b = "world"; 
std::string c = a; 
std::string d = b; 
cout << c + d;

Prima di tutto, è necessario creare un po 'di spazio di memoria dinamica. Poi si può solo strcat le due stringhe in esso. Oppure si può utilizzare il c ++ "stringa" di classe. Il modo vecchia scuola 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);

Nuovo C ++ modo

  std::string three(one);
  three += two;

Se non si conosce la dimensione delle stringhe, si può fare qualcosa di simile:

#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;
}

È possibile utilizzare strstream. E 'formalmente deprecato, ma è ancora un ottimo strumento, se avete bisogno di lavorare con le stringhe C, credo.

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

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

Questa scriverà one e poi two nel flusso, e aggiungere un \0 terminazione utilizzando std::ends. Nel caso in cui entrambe le stringhe potrebbero finire per scrivere i caratteri esattamente 99 - così nessuno spazio sarebbe stato lasciato per iscritto \0 - scriviamo una manualmente l'ultima posizione.

const char* one = "one";
const char* two = "two";
char result[40];
sprintf(result, "%s%s", one, two);

Collegamento a due puntatori char costante senza utilizzare il comando strcpy nell'allocazione dinamica della 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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top