2013-03-10 3 views

답변

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 탐색

자신은 여기에서 시작 :

  • ,321 0

희망이 있습니다.

+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입니다.

자신 만의 operator +을 작성하고 싶지만 인수로 포인터 만 사용하는 IIRC 연산자 오버로드는 허용 할 수 있습니다.

또한이 경우 결과가 동적으로 할당된다는 것을 잊지 마십시오. 메모리 누수를 피하기 위해 delete를 호출하거나 스택 할당 된 문자 배열을 사용하도록 함수를 수정할 수 있습니다. 물론 제공됩니다. 충분한 길이입니다. 모두가 std::string을 권장하는 이유 이제 볼

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

:

+0

IcyFlame의 대답에 대한 내 의견보기. – TonyK

+3

일반적으로 더 나은 대안 – nogard

+0

@nogard입니다'함수 역시()'기능도있다 : '우리는 이미' "이 .txt"두 번째 매개 변수'의 길이를 알고 있기 때문에 strncat'가 여기에 무관하다. 그래서 그것은 단지'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

대신 이전 스타일 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 
관련 문제