wake-up-neo.com

konstante char * Verkettung

Ich muss zwei const-Zeichen wie folgt verketten:

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

Wie kann ich das machen?

Diese char*s werden aus einer Bibliothek eines Drittanbieters mit einer C-Schnittstelle übergeben, sodass ich nicht einfach std::string verwenden kann.

98

In Ihrem Beispiel sind one und two Zeichenzeiger, die auf Zeichenkonstanten zeigen. Sie können die Zeichenkonstanten, auf die diese Zeiger zeigen, nicht ändern. Also alles wie:

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

wird nicht funktionieren. Stattdessen sollten Sie eine separate Variable (Char-Array) haben, um das Ergebnis zu speichern. Etwas wie das:

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.
90
codaddict

Der Weg C:

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

Der C++ - Weg:

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

Die Kompilierzeit:

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

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

Wenn Sie C++ verwenden, verwenden Sie std::string anstelle von C-Zeichenfolgen.

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

std::string three= one+two;

Wenn Sie diesen String an eine C-Funktion übergeben müssen, übergeben Sie einfach three.c_str().

30
Prasoon Saurav

std::string verwenden:

#include <string>

std::string result = std::string(one) + std::string(two);
18
Gregory Pakosz

Update: geändert string total = string(one) + string(two);to string total( string(one) + two ); aus Leistungsgründen (vermeidet die Erstellung von String 2 und temporären String-Gesamtwert)

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()
16
Pedro Reis

Noch ein Beispiel:

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

Wenn Sie jedoch die C++ - Standardbibliothek nicht ausdrücklich verwenden wollen oder können, ist die Verwendung von std::string wahrscheinlich sicherer.

7
stakx

Zunächst müssen Sie dynamischen Speicherplatz erstellen. Dann können Sie einfach die beiden Saiten hinein stratten. Oder Sie können die C++ - Klasse "String" verwenden. Der Old-School-C-Weg:

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

Neuer C++ - Weg

  std::string three(one);
  three += two;
5
Paul Tomblin

Anscheinend verwenden Sie C++ mit einer C-Bibliothek. Daher müssen Sie mit const char * arbeiten.

Ich schlage vor, diese const char * in std::string zu verpacken:

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

Wenn Sie die Größe der Zeichenfolgen nicht kennen, können Sie Folgendes tun:

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

Sie können strstream verwenden. Es ist formal veraltet, aber es ist immer noch ein großartiges Werkzeug, wenn Sie mit C-Strings arbeiten müssen, denke ich.

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

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

Dies schreibt one und dann two in den Stream und fügt mit \0 einen abschließenden std::ends an. Wenn beide Zeichenfolgen genau 99-Zeichen schreiben könnten, so dass kein Platz für \0 vorhanden wäre, schreiben wir eine Zeichenkette an der letzten Stelle. 

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

Verbinden von zwei konstanten Zeichenzeigern ohne Verwendung des Befehls strcpy in der dynamischen Speicherzuordnung:

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