从字符串转换为字符* - 传递函数指针
convert from string to char* - passing function pointer
这篇文章基于这里给出的解决方案,一篇关于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已经工作正常,它接收一个字符串并通过给定的分隔符分隔到子字符串的向量
我使用"//从字符串到 char* 的转换",如图所示将结果返回给调用主程序
没有编译错误,但结果是一串无意义的字符。问题出在哪里?
任何帮助将不胜感激!
谢谢!
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("nn");
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'
您的问题是您在堆栈上创建数据成员writable
,然后用 extension
BUT 指向它,但可写的范围是函数,这意味着当函数返回时writable
被清除,extension
什么都不指向。
您可以为 char* 分配一个动态缓冲区,但这更像是 C 方法而不是C++方法。如果可能的话,我建议更改函数类型以返回字符串或向量,这将使它更容易,并且您可以在需要时将这些类型更改为 char*。
为什么不直接返回扩展名作为std::string
?
例如:
std::string GetFileExtension(std::string filename)
{
std::vector<string> rec;
StrDelimit(filename, '.', rec);
std::string extension = rec[rec.size() - 2];
return extension;
}
首先,你并没有真正返回任何东西;
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
就可以大大简化您的代码。
相关文章:
- 将成员函数指针作为参数传递给模板方法
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- 将函数参数完美转发到函数指针:按值传递呢?
- 将函数指针数组中的函数指针作为模板参数传递
- 如何将函数指针从 std::function 传递到 Linux 克隆?
- 无法将指向类的成员函数的函数指针作为参数传递给同一类的另一个成员函数
- 传递函数指针时未解析的外部符号
- 传递函数指针代替插槽函数
- 在类之间传递函数指针
- 当指针具有可选参数时,如何传递函数指针
- C++传递函数指针
- 传递函数指针 - 语义
- 从成员函数传递函数指针
- 通过引用传递函数指针
- 如何通过调用c#方法通过COM接口传递函数指针
- 如何传递函数指针作为模板参数
- 通过SWIG传递函数指针数组
- 从字符串转换为字符* - 传递函数指针
- C++两次传递函数指针导致问题
- 当传递函数指针时,是否应该转发关于非例外性的知识?