2013-02-24 6 views
0

처음에는 C로 샘플링되었지만 C++로 작업하려는 프로젝트에서 작업 중입니다.strcat 대체 문제 C++

strcat()이 사용되는 섹션이 있는데, 대체 섹션을 사용하라는 메시지가 있습니다. 나는 1 here를 발견,하지만 난 그 컴파일러를 할 때 나에게 다음과 같은 오류 제공 한 :

error: invalid operands of types char*' and char*' to binary `operator+'

내가 잘못하고있는 중이 야 뭔가 거기를?

편집 : 나는을 FileReader를 왜 궁금 분들을 위해 :

가 여기에

FILE *FileOpen(string *fname, string* mode){ 
FILE *fp; 
string *str = ""; 

str += "tmp/"; //all files to be created in temporary sub directory 
str += fname; 
if((fp=fopen(str,mode))==NULL){ 
fprintf(stderr,"Cannot open file: %s\n", &fname); 
exit(1); 
} 
FileReader(fname); 
return(fp); 
} 

편집이 작동하지 않는 코드 부분의 IT 프로젝트의 일부가 2입니다. 코드 해체.

+0

예,'char *'가'std :: string'과 같지 않기 때문에 그렇습니다. – chris

+0

잘못된 코드를 게시하십시오 – KillianDS

+0

"내가 잘못하고있는 것이 있습니까?" 분명히 그렇습니다. 그렇지 않으면 오류가 발생하지 않습니다. 이제 네가 틀린 짓을하는 걸 물어 보려고했다면 ... 코드를 보지 않고 어떻게 선의 이름으로 알 수 있을까? – Cubic

답변

1

코드를 게시 해 주셔서 감사합니다. 이제 문제는 쉽게 드러납니다.

포인터가 아닌 문자열 개체를 사용해야합니다.

FILE *FileOpen(string fname, string mode) 
{ 
    string str = ""; 

    str += "tmp/"; //all files to be created in temporary sub directory 
    str += fname; 
    FILE *fp = fopen(str.c_str(), mode.c_str()); 
    if (!fp) { 
     fprintf(stderr, "Cannot open file: %s\n", fname.c_str()); 
     exit(1); 
    } 
    FileReader(fname); 
    return fp; 
} 

좋은 다음 단계는 std::string 인수를 사용할 I/O 기능으로 이동하는 것입니다, 그래서 당신은 어디서나 .c_str() 말을 할 필요가 없습니다.

또한 파일 열기 기능에 FileReader(fname)이있는 이유가 혼란 스럽습니다. 그것은 Single-Responsibility-Prinicple을 두 번 위반합니다.파일을 열어 파일을 읽지 않아야하며 파일을 읽는 코드는 FILE*을 사용해야하며 파일 이름이 무엇인지 신경 쓰지 않아야합니다 (오류 메시지 생성은 제외).

+0

프로젝트의 두 번째 부분에 대한 FileReader가 있습니다 (프로그램을 디스 어셈블하는 경우). –

+0

@JulioGarcia : 당연히 당신은 어딘가에'FileReader'가 필요하지만이 함수 안에는 필요 없습니다. 이 함수를 호출 한 후 주 루틴에서 호출해야합니다. –

+0

알았어, 알았어. 이제 FileReader에 문제가 있습니다. 여기에 또는 다른 질문에 넣을까요? > .;;;; –

0

코드에서 char *을 문자열로 사용하는 경우 strcat이 아마도 올바른 기능 일 것입니다. 물론 C++ 솔루션은 std::string을 사용할 수 있습니다.이 경우 std::string에 사용할 수있는 이진수가 operator+이므로 + 만 사용할 수 있습니다.

+0

글자를 문자열로 변경하고 같은 결과를 얻습니다. . –

+0

@JulioGarcia, 우리가 볼 수 있도록 코드를 보여주십시오. – chris

+1

어떻게하면 오류가 발생합니까? std :: string에서 2 진'operator + ''에 char *'및 char * '유형의 유효하지 않은 피연산자가 있습니까? 또는 "같은 결과"라고 말하면 "오류가 발생합니다"라는 의미입니까? 나는 당신의 코드를 추측하는 내 기술이 작동하지 않는다고 생각한다.;) –

1

당신은 어떤 코드를 표시하지 않은,하지만 당신은 이미 눈치 나는, 당신이

char *s1 = "Hello, ", *s2 = "world!"; 
char buf[50]; 
strcpy(buf, s1); 
strcat(buf, s2); 

같은 일을했고 지금은

char *s1 = "Hello, ", *s2 = "world!"; 
char buf[50]; 
buf = s1 + s2; 

이 작동하지 않습니다에 변경 의심 . 넌 아니라 잘

std::string s1 = "Hello, ", s2 = "world!"; 
std::string buf = s1 + s2; 
0

std::string에 숯 포인터 및 문자 배열을 변경하며, C++ 연산자 +는 그 연결을 수행하는 캐릭터 클래스 std::string있다. 하지만 먼저 하나 만들어야합니다.

따라서 "abc" + "def"이라는 표현은 컴파일되지 않지만 std::string("abc")+"def"은 정상적으로 작동합니다. 당신은 많은 양의 텍스트을 연결하고, 성능에 대한 관심, std::ostringstream 사용을 고려할 경우

또는 당신은

std::string s = "abc"; 
s += "def"; 

을 유사하게

std::string s("abc"); 
s += "def"; 

같은 것을 쓸 수 있습니다.

+0

왜 문자열을 연결하는 데있어서 문자열링 스트림이 더 효과적 일 것이라고 생각합니까? – KillianDS

+0

@yonil, 모든 준수하는 C++ 11 구현이 있습니다. – chris

+2

@yonil : 그리고'std :: stringstream'이 연속적인 메모리를 사용한다고 생각하지 않습니까? 기하 급수적 인 버퍼 확장은 더 빠른 이유이며, 불연속성과 관련이 없습니다. –