2013-03-10 27 views
48

ディレクトリにあるファイルを開くことができるように.txt拡張子を追加するプライベートクラス変数(char name [10])があります。これについてどうすればいいですか?連結された文字列を保持する新しい文字列変数を作成することが望ましいでしょう。C++で2つの文字列を連結する方法は?

答えて

86

まず、char*またはchar[N]を使用しないでください。 std::stringを使用すると、他のすべてがとても簡単になります!

例として、

std::string s = "Hello"; 
std::string greet = s + " World"; //concatenation easy! 

簡単、そうではありませんか?今、あなたは、このようなあなたには、いくつかの関数に渡したいときなど、何らかの理由でchar const *必要がある場合

、あなたはこれを行うことができます。この機能を想定し

some_c_api(s.c_str(), s.size()); 

が宣言されているように:

some_c_api(char const *input, size_t length); 

はここから始まるstd::string自分も見てみよう

希望に応じます。

+0

をひそかことができ、この文字列連結の時間複雑さとは何ですか? – d34th4ck3r

+0

@ d34th4ck3r:線形です。 – Nawaz

11

char*の代わりにstd::stringを使用しないのはなぜですか? 連結は些細なことになります。すべての

std::string str = "abc"; 
str += "another"; 
5

"Cスタイルの文字列"連結を行う移植されたCライブラリのstrcat()関数があります。あなたがしようとし、独自の機能を考え出すないため

はBTW C++は、Cスタイルの文字列を扱うための機能の束を持っているにもかかわらず、それが有益である可能性があり、そのようなもの:

char * con(const char * first, const char * second) { 
    int l1 = 0, l2 = 0; 
    const char * f = first, * l = second; 

    // step 1 - find lengths (you can also use strlen) 
    while (*f++) ++l1; 
    while (*l++) ++l2; 

    char *result = new char[l1 + l2]; 

    // then concatenate 
    for (int i = 0; i < l1; i++) result[i] = first[i]; 
    for (int i = l1; i < l1 + l2; i++) result[i] = second[i - l1]; 

    // finally, "cap" result with terminating null char 
    result[l1+l2] = '\0'; 
    return result; 
} 

...そして...

char s1[] = "file_name"; 
char *c = con(s1, ".txt"); 

...結果はfile_name.txtです。

自分で書くこともできますが、引数としてポインタだけを使用してIIRC演算子のオーバーロードを行うことはできません。operator +

また、この場合の結果が動的に割り当てられていることを忘れないでください。メモリリークを避けるためにdeleteを呼び出すこともできますし、スタック割り当て文字配列を使用するように関数を変更することもできます十分な長さを有する。誰もがstd::stringを推奨していますなぜあなたは今見

char filename[sizeof(name) + 4]; 
strcpy (filename, name) ; 
strcat (filename, ".txt") ; 
FILE* fp = fopen (filename,... 

+0

IcyFlameの答えに自分のコメントを見てください。 – TonyK

+3

また、 'strncat()'関数もあります。これは通常、より良い代替手段です。 – nogard

+0

@nogard: 'strncat'は第2引数' '.txt" 'の長さをすでに知っているのでここでは無関係です。だから、 'strncat(name、" .txt "、4)'となるだけで、何も得られません。 – TonyK

6

あなたが本当にnameを想定し、C言語でプログラミングしていた場合は、あなたが言うような固定長配列では、次のような何かをする必要がありますか?

+1

男はC++ではなくCで質問していますか? – IcyFlame

+9

「あなたがプログラミングしていたら...」と言われたことは分かりませんか? – TonyK

+0

この質問にはこの回答は関係ないと思いませんか? – IcyFlame

-2
//String appending 
#include<iostream> 
using namespace std; 
void stringconcat(char *str1, char *str2){ 
while (*str1 != '\0'){ 
    str1++; 
} 
while(*str2 != '\0'){ 
    *str1 = *str2; 
    str1++; 
    str2++; 
} 
return ;  
} 
int main( ){ 
char str1[100]; 
cin.getline(str1,100); 
char str2[100]; 
cin.getline(str2,100); 
stringconcat(str1,str2); 
cout<<str1; 
getchar(); 
return 0; 
} 
+1

.........私は何を見ていますか? –

0

strcat(destination、source)は、C++で2つの文字列を連結するために使用できます。

あなたはそれではなく、古いスタイルのC文字列のC++文字列クラスを使用することをお勧めし

http://www.cplusplus.com/reference/cstring/strcat/

0

リンク - 次のルックアップすることができます深い理解を持っているために、人生はずっと容易になるだろう。あなたは古いスタイルの文字列を既存している場合

、あなたは文字列クラスに

char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; 
    cout<<greeting + "and there \n"; //will not compile because concat does \n not work on old C style string 
    string trueString = string (greeting); 
    cout << trueString + "and there \n"; // compiles fine 
    cout << trueString + 'c'; // this will be fine too. if one of the operand if C++ string, this will work too