2013-03-29 57 views
1

我試圖編寫一個簡單的函數來獲取名字,並在添加擴展名後返回。 例如,如果我有字符指針「abcd」該函數應該返回「abcd.as」在C中使用strcpy函數,不知道長度

我試圖寫這個函數,獲取字符指針,並返回一個指向新的字符後添加擴展名。但不工作有人知道爲什麼嗎?

char* AddFileExtension(char* FileName) 
{ 
    char* FixFileName=NULL; 
    char* Extension = ".as"; 
    strcpy(FixFileName, FileName); 
    strcat(FixFileName, Extension); 
    return FixFileName; 
} 

回答

1

你必須爲FixFileName分配內存:

char* Extension = ".as"; 
char* FixFileName = malloc(strlen(FileName) + strlen(Extension) + 1); 

當你用它做不要忘記free()內存。出於顯而易見的原因,這必須在功能之外完成。

+0

char * FixFileName = malloc(strlen(FileName)+ strlen(Extension)+ 1);爲什麼你在malloc的末尾加了「+1」? – Yuval

+1

@Yuval:對於NUL終結者。 http://en.wikipedia.org/wiki/Null-terminated_string – NPE

1

你必須爲FixFileName分配內存和分配內存的大小應該是 FileName + sizeof(".as")

注意長度:sizeof將計算".sa"字符串的空字符所以沒必要加1字符串的空charachter FixFileName

char* AddFileExtension(char* FileName) 
{ 
#define EXTENSION_AS ".as"  
    char* FixFileName= malloc(strlen(FileName) + sizeof(EXTENSION_AS)); 

    sprintf(FixFileName, "%s%s", FileName, EXTENSION_AS); 
    return FixFileName; 
} 

不要忘記釋放分配的內存時,它成爲了無用的程序free()

+0

你可能會考慮使用'strlen(EXTENSION_AS)'而不是'sizeof(EXTENSION_AS)'。它們同樣快,因爲它們在編譯時都被評估過(在這種情況下)。但是,sizeof(EXTENSION_AS)'會計算NUL字節。換句話說,你正在分配一個額外的字節。 –

+0

@DietrichEpp對於這個大小的數字,你是對的。所以我會從表情中移除+1。 – MOHAMED

+0

@DietrichEpp'strlen()'在編譯時無法執行。這是一個運行時函數,它不是宏 – MOHAMED

0
char* AddFileExtension(char* FileName) 
{ 
    char* FixFileName=NULL; 
    char* Extension = ".as"; 
    FixFileName=(char *) malloc(strlen(FileName)+strlen(Extension)+1); 
    strcpy(FixFileName, FileName); 
    strcat(FixFileName, Extension); 
    return FixFileName; 
} 

試試上面的代碼。你必須在完成後釋放內存

+0

這有一個緩衝區溢出,因爲它沒有在最後爲NUL字節分配內存。 –

+0

投射malloc的結果是不必要的,[在某些情況下有害](http://stackoverflow.com/a/605858/1600898)。 – user4815162342

相關問題