2014-03-29 3 views
0

초보자 용 질문처럼 들리지만 저는 char *로 C++로 일한 적이 없습니다. 나는 항상 문자열을 사용했다. 그러나 Ubuntu 13.10NVidiaOpenGL 드라이버가있는 버그가 있으므로 char *를 사용해야합니다. Here이 버그입니다.Const Char를 Char * C++에 덧붙임

나는 생성자에서 const char* folderName을 취한 다음이 폴더에있는 모든 .glsl 파일을 컴파일하는 클래스가 있습니다. 나는 strcpystrcat을 시도했으며 둘 다 너무 겹쳐 보입니다.

glProgram *p = new glProgram("phong\n"); 
glProgram :: glProgram(const char* folderName) 
{ 
    cout << folderName << endl; 
    char* name = strdup(folderName); 
    cout << name << endl; 
    name = strcat(name,"/vertex.glsl");  
    cout << name << endl; 
} 

그러나 예상대로 출력되지 않습니다.

phong 
phong 
/vertex.glsl 

는 어떻게 얻을 수 출력이 될 phong/vertex.glsl ?

+1

새 문자열을 할당하는 데 'strdup'을 사용하지 않아야합니다. 더 큰 결과를 저장할 정도로 크지 않습니다. 그 외에는 당신의 결과를 설명 할 수 없습니다. –

+2

폴더 이름에 줄 바꿈 문자가 있습니다. 당신은 그들이 왜 연결되어 있지 않다고 생각하지 않는 것이 틀림 없는가? 또한 폴더 이름을 복사하기 위해'strdup'를 사용했고 폴더 이름과 파일 이름을 연결하기 위해'strcat'를 사용했습니다. 그렇게하면 연결을위한'name'에 충분한 공간이 있음을 보장 할 수있는 방법이 없습니다. –

+1

당신은'const char * a = "one"을 의미합니다; const char * b = "two"; size_t len1 = strlen (a); size_t len2 = strlen (b); char * buff = new char [len1 + len2 + 1]; strcpy (buff, a); strcat (buff, b);'? 또한 할당 된 공간을 삭제하는 것을 잊지 마십시오. – PeterT

답변

3

동적으로 할당 된 배열에 속하지 않는 메모리를 덮어 쓰기 때문에 코드가 유효하지 않습니다. 연결된 문자열을 포함 할만큼 충분히 큰 메모리 영역을 할당해야합니다.

glProgram *p = new glProgram("phong\n"); 

glProgram :: glProgram(const char *folderName) 
{ 
    const char *vertex = "/vertex.glsl"; 

    size_t n = std::strlen(folderName); 
    if (n != 0 && folderName[n - 1] == '\n') --n; 

    char *name = new char[n + std::strlen(vertex) + 1]; 

    std::strncpy(name, folderName, n); 
    name[n] = '\0'; 
    std::strcat(name, vertex); 
} 

또한 인수에 줄 바꿈 문자가 포함되어 있다는 느낌이 들지 않습니다. 인수가 "phong"으로 보이지 않는 이유는 무엇입니까?

+0

감사합니다. 인수에서'\ n'을 제거하는 것이 좋습니다. –