2013-02-24 31 views
0

这个帖子基础上给出here的解决方案,后在SO从字符串转换为char * - 传递函数指针

我写一个函数来获取给定的文件扩展名(string类型),是这样的:

void GetFileExtension(string filename, char* extension) 
{ 
    vector<string> rec; 

    StrDelimit(filename, '.', rec); 

    //cout << rec[rec.size()-2].c_str()[1] << endl; 

    //extension = rec[rec.size()-2].c_str()[0]; 

    //extension = &rec[rec.size()-2].c_str()[0]; 

    string str = rec[rec.size()-2]; 

    // conversion from string to char* 
    vector<char> writable(str.size() + 1); 

    std::copy(str.begin(), str.end(), writable.begin()); 

    //cout << writable << endl; 

    extension = &writable[0]; 
} 

StrDelimit正常工作已经接收的字符串和由给定的定界符

我使用了“//从字符串转换为char *”,如图到结果返回到调用主程序界定于子串的矢量

没有编译错误,但结果是一串无意义的字符。这是什么问题?

任何帮助将不胜感激!

谢谢!

回答

1

char *扩展名是临时字符串地址的副本。要真正将新数据添加到其中,您必须将数据复制到其保存的地址。

这有帮助吗?

#include <stdio.h> 
#include <string.h> 

void getStringInoExistingBufer(char* existingBufferOut) 
{ 
    strcpy(existingBufferOut, "someData"); 
} 

void getStringIntoNonExistingBuffer(char **newBufferOut) 
{ 
    *newBufferOut = strdup("someOtherData"); 
} 

int main() 
{ 
    char buffer1[100] = {}; 
    char *buffer2 = NULL; 

    printf("buffer1 (before): '%s'\n", buffer1); 
    getStringInoExistingBufer(buffer1); 
    printf("buffer1 (after): '%s'\n", buffer1); 

    printf("\n\n"); 
    printf("buffer2 (before): '%s'\n", buffer2); 
    getStringIntoNonExistingBuffer(&buffer2); 
    printf("buffer2 (after): '%s'\n", buffer2); 
} 

输出:

buffer1 (before): '' 
buffer1 (after): 'someData' 


buffer2 (before): '(null)' 
buffer2 (after): 'someOtherData' 
+0

谢谢你的完整答案:) – 2013-02-24 14:51:35

0

你的问题是你创建堆栈上的数据成员writable,然后指向它extension但可写的范围是功能意味着当函数返回writable是被清理离开extension指着什么。

您可以为char *分配一个动态缓冲区,但这比C++更适合C方法。 如果可能的话,我会建议改变函数类型来返回一个字符串或向量,这将使它更容易,你可以在需要时将这些类型改为char *。

0

为什么不只是返回分机号码为std::string

例如:

std::string GetFileExtension(std::string filename) 
{ 
    std::vector<string> rec; 

    StrDelimit(filename, '.', rec); 

    std::string extension = rec[rec.size() - 2]; 
    return extension; 
} 
+0

谢谢!这是我后 – 2013-02-24 14:14:50

0

首先,你没有真正返回任何东西;

void GetFileExtension(string filename, char* extension) 
{ 
    ... 
    extension = &writable[0]; // Assignment to local variable 
} 

如果您打算更新extension通过的char *,你需要把它作为一个char**(即的一个指针char*)。其次,即使你修复了这个问题,你也试图返回一个指向局部变量中数据的指针;

void GetFileExtension(string filename, char* extension) 
{ 
    ... 
    vector<char> writable(str.size() + 1); // Local variable 
    ... 
    extension = &writable[0];  // writable disappears after this line 
            // and extension will point to invalid memory 
} 

只要返回std::string就可以简化您的代码。

相关问题