2011-12-13 5 views
2

먼저 C# 프로그래머이므로 C++에 대한 실무 지식이 상당히 제한적입니다. 나는 대학에서 그것을 다시 가져 갔지만 10 년 만에 그것을 건드리지 않았기 때문에 이것이 비교적 간단한 것이라면 용서해주십시오.C++에서 두 char *을 연결하는 함수

libwpd 라이브러리를 구현하는 C#에서 사용할 수있는 DLL을 만들려고합니다.

P/Invoke를 통해 액세스 할 수있는 두 가지 기능을 내보내는 DLL을 만들었습니다. 첫 번째는 상수 (Visual Studio에서 샘플로 생성), 두 번째 문자열을 반환합니다.

함수에서 상수 문자열을 반환하면 C#으로 전달되고 반대쪽에서 읽을 수 있으므로 데이터가 다시 전달됩니다.

내가 겪고있는 문제는 libwpd입니다. 필자는 TextDocumentGenerator.cpp 파일을 수정하여 나중에 * 액세스 할 수 있도록 사용하는 printf 대신 char *에 정보를 추가해야했습니다.

헤더 파일의 public 섹션에 변수 정의를 추가하여 호출 코드에서 읽을 수 있도록했습니다.

이제 libwpd에서 주어진 char *를 외부 char *에 추가 할 수있는 함수를 작성하려고합니다.

char* addString(const char* addThis, char* toThis) 
{ 
char* copier = (char*)malloc(strlen(toThis) + 1 + 1); 
strcpy(copier, toThis); 
strcpy(copier, "1"); 

toThis = (char*)malloc(strlen(copier) + 1); 
strcpy(toThis, copier); 

return copier; 
} 

을하지만 다시 정보를 전달할 때, 나는 빈 문자열을 얻을 :

나는이 마련했습니다.

내가

totalFile = addString("\n", totalFile);를 호출하여 함수를 호출 (나는 그것이 기술적으로 반복 문자열에 "1"을 추가해야 실현하지만, 심지어 일을 아니에요)

난에 대한 strcat와 할 수있는 strcpy를 변경하는 경우 복사기 라인, 그건 자물쇠.

나는 C++로 프로그램을 만드는 법을 모른다. 그래서 나는 무엇이 일어나고 있는지를보기 위해 함수를 단계적으로 검토 할 수있다.

도움을 주시면 감사하겠습니다.

+0

'strcpy (복사기, toThis); strcpy (복사기, "1");'- 두 번째'strcpy'는 첫 번째 결과를 덮어 씁니다. –

+0

C++에서'malloc'을 사용하고 있다면, 거의 항상 잘못된 것을하고 있음을 의미합니다. C++에서'new'를 사용하는 자신을 발견하면 여전히 잘못된 것을하고 있다는 뜻입니다. 'new '가 필요한 공통 시나리오의 많은 부분이 표준 템플릿 라이브러리에 이미 제공되어 있습니다. – Brian

+0

@Trevor 친숙한 팁 : C++ 프로젝트를 C++/CLI로 컴파일하고 프로젝트에서 네이티브 코드 용 관리되는 래퍼를 만드는 것이 좋습니다. 그런 식으로, 그것은 그것과 인터페이스를 훨씬 청소기입니다. 평소와 같이 참조를 추가하기 만하면 래퍼의 관리 인스턴스를 만들 수 있습니다.이 인스턴스에는 기본 클래스에 대한 관리되지 않는 포인터가 들어 있습니다. – Max

답변

6

std::string의 존재를 알고 있습니까? C++에서 문자열을 처리하는 클래스입니다. char *은 C의 유산입니다.

std::string+ 연산자를 제공하므로 원하는대로 처리 할 수 ​​있습니다.

+0

std :: string을 알지 못했습니다. 기존 코드와 함께 사용해야하는 학교와 학교에서는 char *을 사용 했으므로 사용하려고했던 코드입니다. std :: string에 대한 액세스 권한이없는 것 같습니다 (포함되지 않았습니까?)하지만 찾아 볼 것입니다. –

+0

그는 이것을 C#에서 호출하려고하기 때문에'std :: string'이 작동하지 않을 것입니다 (최소한 매개 변수와 반환 값에 대해서는). – crashmstr

+0

#include . 다음 번에 "cppreference "과 같은 정보를 얻으려면 – Griwes

2

반환 문자열에 충분한 공간을 할당하고 대상 문자열을 대상 버퍼에 복사 한 다음 strcat를 호출하여 추가 정보를 추가해야합니다. 예를 들어

:

char* addString(const char* addThis, const char* toThis) 
{ 
    char* destination = (char*)malloc(strlen(addThis) + strlen(toThis) + 1); 
    strcpy(destination, toThis); 
    strcat(destination, addThis); 
    return destination; 
} 

는이 기능을 호출 한 후 어떤 점에서 free(destination)를 호출해야합니다 잊지 마십시오.

편집 : 물론이 질문은 제안 된 기능을 수정 한 것입니다. 실제로 함수에서 포인터를 반환하고 호출자를 계산하여 계산을 해제하는 것은 좋은 생각이 아닙니다.C보다는 C++을 사용하기 때문에 std :: string과 같은 C++ 구조체를 사용하거나 shared_ptr 또는 유사한 형식으로 char *을 래핑하는 것이 훨씬 나을 것입니다.

C++을 쓰려면 주제에 a good book을 구입하는 것이 좋습니다. 실제로 무엇을하고 있는지 모르는 경우 발에서 자신을 찍기가 너무 쉽습니다.

+0

이것은 반드시 좋은 생각은 아닙니다. 호출자가 할당 한 메모리 블록을 해제해야합니다. 이것은'shared_ptr'을 사용하지 않는 것만큼 나쁩니다. 당신은 기억을 할당하고, "그걸로 망할 것"이라고 말합니다. 어떤 사람들은 동의하지 않을 수도 있지만, 나는이 나쁜 습관을 발견한다. –

+0

@ Moo-Juice 개인적으로 나는 이와 같은 함수를 작성하지 않을 것이라고 동의합니다. 나는 그 질문에서 제안 된 기능의 엉망을 바로 잡았다. 내가 가정 한 그 면책 조항에서 편집 할 수 있습니다. – obmarg

+0

첫 번째 strcmp는 내가 그것을 바꿔 놓았을 때 막히게하는 원인이었습니다. strcpy/strcmp로 실행하면이 지점을지나 가게됩니다. 아마도 sprintf 또는 std :: string을 살펴볼 것입니다. 링크 오류를 지나칠 수 있다면 말입니다. 의견에 감사드립니다! –

1

printf() 전화를 대체하기 때문에 sprintf()은 아마도 문자열을 만드는 가장 쉬운 방법 일 것입니다.

+0

필요한 include가 libwpd를 깨기 전까지는 비교적 유망 해 보였습니다. 코멘트 주셔서 감사합니다! –

+0

@ Trevor :'printf', ''헤더에 필요한 것과 동일한 include 만 필요합니다. – sth

0

첫째로, Griwes는 정확합니다. 당신은 당신이하고있는 일을하고이 질문을 C++로 표시하지 않습니다. 간단한 이유는 C++에서 문자열로 작업하는 방식이 아니라는 것입니다.

C# 프로그래머는 String 클래스를 잘 알고 있습니다. 글쎄, std::string도 비슷합니다. 문자열을 다룰 때 다리 작업을 수행하므로 추락하는 고통스러운 경로를 따라갈 필요가 없습니다.

std::string a = "I slept with "; 
std::string b = "a heavy heart."; 
std::string c = a + b; 

짜잔 :

는만큼 간단, C++에서 두 개의 문자열을 연결합니다.

+0

단점은 기존 코드 또는 char *로 작성된 코드를 사용하는 것입니다. std :: string을 char *로 변환하고 문제없이 다시 사용할 수 있습니까? std :: string에 대한 액세스 권한이 없습니다 (포함 어딘가에 누락). 학교에서 그리고 수정중인 기존 소스 코드에서 char *가 사용되어 char *를 사용했습니다. 나는 그것에 접근 할 수 있다면 확실히 std :: string을 살펴볼 것이다. –

+1

@ TrevorWatson, 예. 위의 예제에서'c.c_str()'을 호출하면 정규'const char *'를 얻을 수있다. –

+0

@TrevorWatson :'std :: string'은 표준 템플릿 라이브러리의 일부입니다. 괜찮은 C++ 컴파일러에 포함될 것입니다. 'std :: string' 대신'char *'를 사용하는 것은'System.String'을 사용하는 대신 C#에서'char []'를 사용하는 것과 유사합니다. – Brian