0

这篇文章基于这里给出的解决方案,关于 SO

我编写了一个函数来获取给定的文件扩展名(字符串类型),例如:

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 工作正常,它接收一个字符串并通过给定的分隔符分隔子字符串的向量

如图所示,我使用“//从字符串到字符*的转换”将结果返回给调用主程序

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

任何帮助,将不胜感激!

谢谢!

4

4 回答 4

1

char *extension 是字符串地址的临时副本。要真正将新数据放入其中,您必须将数据复制到它保存的地址。

这有帮助吗?

#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'
于 2013-02-24T07:58:02.853 回答
0

你的问题是你writable在堆栈上创建数据成员,然后用 BUT 指向它extension,可写的范围是函数,这意味着当函数返回时writable被清除,extension没有指向任何东西。

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

于 2013-02-24T07:47:42.903 回答
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;
}
于 2013-02-24T07:48:27.343 回答
0

首先,您并没有真正返回任何东西。

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

如果您打算更新传入的 char* extension,则需要将其作为 a 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
}

只需返回 anstd::string就会大大简化您的代码。

于 2013-02-24T07:49:13.990 回答