2013-03-29 29 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

相关问题