C ++에서 두 문자열을 연결하는 방법은 무엇입니까?


100

디렉토리에있는 파일을 열 수 있도록 확장자 char name[10]를 추가하고 싶은 개인 클래스 변수 가 .txt있습니다.

어떻게해야합니까?

연결된 문자열을 보유하는 새 문자열 변수를 만드는 것이 좋습니다.

답변:


160

우선 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여기에서 시작하여 자신을 탐색 하십시오.

도움이 되었기를 바랍니다.


3
이 문자열 연결의 시간 복잡성은 무엇입니까?
d34th4ck3r

@ d34th4ck3r : 선형입니다.
Nawaz

30

C ++이므로 std::string대신 사용하지 않는 이유 는 char*무엇입니까? 연결은 간단합니다.

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

1
주목할만한 점은, 사소한 사용은 런타임 성능과 관련하여 사소한 가격표와 함께 제공됩니다. 최악의 경우는 operator+=할당 해제와 할당을 모두 수행 한다는 것 입니다. 힙 할당은 우리가 일반적으로 수행하는 가장 비용이 많이 드는 작업 중 하나입니다.
IInspectable

15

C로 프로그래밍하는 경우 name실제로 말한 것처럼 고정 길이 배열 이라고 가정 하면 다음과 같은 작업을 수행해야합니다.

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

이제 왜 모두가 추천하는지 알 std::string겠습니까?


1
그 남자가 C가 아닌 C ++로 질문 한 것을 볼 수 없습니까 ??
IcyFlame 2013 년

21
내가 "당신이 프로그래밍한다면 ..."이라고 말한 것을 볼 수 없습니까?
TonyK 2013 년

이 답변이이 질문과 관련이 없다고 생각하지 않습니까?
IcyFlame 2013 년

9
"the guy"가 std :: string 대신 char을 사용하고 있기 때문에 이것이 관련이 있다고 생각합니다. 또한 가장 많이 득표 한 답변에 표시되지 않은 명시적인 연결 방법을 보여줍니다. 적어도 나는 그것으로 무언가를 배웠다.
gvegayon

1
이것은 또한 동적 메모리 할당없이 문자열 연결을 수행하는 방법을 보여줍니다. 내가 틀리지 않는 한 std :: string operator + =는 가능한 재 할당이 필요합니다.
Ashley Duncan

7

"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.

직접 작성하고 싶을 수도 operator +있지만 IIRC 연산자는 인수가 허용되지 않으므로 포인터 만 사용하여 오버로드합니다.

또한이 경우 결과는 동적으로 할당되므로 메모리 누수를 방지하기 위해 delete를 호출하거나 스택 할당 문자 배열을 사용하도록 함수를 수정할 수 있습니다 (물론 길이가 충분한 경우).


IcyFlame의 답변에 대한 내 의견을 참조하십시오.
TonyK 2013 년

3
또한이 strncat()일반적으로 더 나은 대안이다 기능
nogard

@nogard : strncat여기서는 두 번째 매개 변수의 길이를 이미 알고 있기 때문에 관련이 없습니다 ".txt". 그래서 그것은 strncat(name, ".txt", 4)우리에게 아무것도 얻지 못하는.
TonyK


0

이전 스타일의 C 문자열 대신 C ++ 문자열 클래스를 사용하는 것이 더 낫습니다. 삶이 훨씬 쉬울 것입니다.

기존의 기존 스타일 문자열이있는 경우 문자열 클래스로 변환 할 수 있습니다.

    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

0

C ++ 14

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

질문에 대한 답변 :

auto fname = ""s + name + ".txt";

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

int main() {
    char str1[100];
    cin.getline(str1, 100);  
    char str2[100];
    cin.getline(str2, 100);

    stringconcat(str1, str2);

    cout<<str1;
    getchar();
    return 0;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.