C# 通过不断变化的c++;应用程序组件之间需要char*参数的字符串
我正在寻找一种廉价而简单的方法,在位于框架顶部的应用程序组件之间传递变化的字符串(类似于C#),该应用程序的API(用C++98编写)中需要char*参数 大致如下:C# 通过不断变化的c++;应用程序组件之间需要char*参数的字符串,c#,c++,visual-c++,c++98,C#,C++,Visual C++,C++98,我正在寻找一种廉价而简单的方法,在位于框架顶部的应用程序组件之间传递变化的字符串(类似于C#),该应用程序的API(用C++98编写)中需要char*参数 大致如下: char* get_filename (char* source_name ) { std::string fname = source_name; // switch source extension to .tmp fname = fname.substr(0, fname.rfind("."))+".TMP";
char* get_filename (char* source_name ) {
std::string fname = source_name;
// switch source extension to .tmp
fname = fname.substr(0, fname.rfind("."))+".TMP";
return (char*) fname.c_str();
}
ret i = api_call( get_filename( "C:\TEMP\1.DAT") );
上面的内容似乎正在失去作用域,所以我很好奇是否有一种廉价的方法可以在没有缓冲区的情况下操作字符串,strcpy,new和free,没完没了。如果C++中有可能,则与C或java的字符串最接近。p> 像当前定义的
get_filename()
这样的函数只有在返回指向源数据请求部分的指针而不更改数据时才有意义。下面,如果get\u filename(“C:\\TEMP\\1.DAT”)
返回指向“1.DAT”
的指针,则不会分配新字符串“1.TMP”
,例如
char* get_filename (char* source_name )
{
char *fname = strrchr(source_name, '\\');
if (fname) {
++fname;
}
return fname;
}
ret i = api_call( get_filename( "C:\\TEMP\\1.DAT") );
但是如果您想要额外的分配/更改,那么您需要将函数改为使用std::string
,例如:
std::string get_new_filename (const std::string &source_name)
{
// switch source extension to .tmp
std::string fname = source_name.substr(0, source_name.rfind(".")) + ".TMP";
return fname;
}
ret i = api_call( get_new_filename("C:\\TEMP\\1.DAT").c_str() );
如果C API需要的是char*
而不是const char*
,则有几种不同的处理方法:
// safe as long as api_call() doesn't try
// to alter the character data, only read it
std::string fname = get_new_filename("C:\\TEMP\\1.DAT");
ret i = api_call( const_cast<char*>(fname.c_str()) );
返回的
char*
必须来自某个地方。选择一个固定大小的char
缓冲区,或者使用new
和strcpy
创建它。C++中很少有“便宜”的东西。除了最琐碎的任务之外,一切都需要工作。@Sam,我希望std::string能以某种方式解决这个问题。std::string
的全部目的是它完全自己管理内存,并在string对象被销毁时将其删除。std::string
的用途恰恰与此相反。static
,也许?我不确定这对你的工作来说是一个好的选择,但它对你来说是可用的。
// guaranteed safe in C++11 or later,
// *may* be safe in earlier versions,
// depending on library implementation
std::string fname = get_new_filename("C:\\TEMP\\1.DAT");
ret i = api_call( &fname[0] );
// requires C++17 or later, also guaranteed safe
std::string fname = get_new_filename("C:\\TEMP\\1.DAT");
ret i = api_call( fname.data() );