これらのような2つのconst charを連結する必要があります。
const char *one = "Hello ";
const char *two = "World";
どうすればそれを行うことができますか?
これらのchar*
sは、Cインターフェイスを備えたサードパーティライブラリから渡されるため、代わりにstd::string
を使用することはできません。
あなたの例ではoneとtwoは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.
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++を使用している場合、Cスタイルの文字列の代わりにstd::string
を使用しないのはなぜですか?
std::string one="Hello";
std::string two="World";
std::string three= one+two;
この文字列をC関数に渡す必要がある場合は、three.c_str()
を渡すだけです
std::string
を使用:
#include <string>
std::string result = std::string(one) + std::string(two);
更新:パフォーマンス上の理由で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()
もう1つの例:
// 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
を使用する方がおそらく安全です。
文字列のサイズがわからない場合は、次のようなことができます。
#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;
}
まず、動的なメモリ空間を作成する必要があります。次に、2つの文字列をstrcatするだけです。または、C++「文字列」クラスを使用できます。古い学校の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);
新しいC++の方法
std::string three(one);
three += two;
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;
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
を書き込むスペースが残らない場合-最後の位置に手動で書き込みます。
const char* one = "one";
const char* two = "two";
char result[40];
sprintf(result, "%s%s", one, two);
メモリの動的割り当てでstrcpyコマンドを使用せずに2つの定数charポインターを接続する:
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;