2014-03-29 141 views
0

我知道這聽起來像是一個初學者問題,但我從未在C++中使用過char *。我總是使用字符串。但是有一個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(淺黃色,一個); strcat的(淺黃色,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'更好。 –