[英]convert from string to char* - passing function pointer
这篇文章基于此处给出的解决方案
我编写了一个函数来获取给定的文件扩展名(字符串类型),例如:
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("\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'
您的问题是您在堆栈上创建了writable
的数据成员,然后使用extension
BUT指向它,而可写范围是该函数,这意味着当该函数返回writable
时,该extension
名将被清除,而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
会大大简化您的代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.