Jab*_*bez 1 c++ string const char
以下是我的示例代码.它只是一个样本,类似于我在我的应用程序中使用的代码.
#define STR_SIZE 32
void someThirdPartyFunc(const char* someStr);
void getString(int Num, const char* myStr)
{
char tempStr[] = "MyTempString=";
int size = strlen(tempStr) + 2;
snprintf((char*)myStr, size, "%s%d", tempStr, Num);
}
int main()
{
const char * myStr = new char(STR_SIZE);
getString(1, myStr); // get the formated string by sending the number
someThirdPartyFunc(myStr); // send the string to the thirdpartyFunction
delete myStr;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我使用此代码,我会收到异常.我认为问题在于删除"myStr".但删除是非常必要的.
有没有其他方法来格式化getString中的字符串并将其发送到ThirdPartyFunc?
提前致谢.
你不是分配一个字符数组,而是用这一行分配一个字符:
const char * myStr = new char(STR_SIZE);
Run Code Online (Sandbox Code Playgroud)
并且一个已分配的char用值初始化,STR_SIZE在这种情况下导致"char溢出".
如果你想要一个大小的数组STR_SIZE:
const char * myStr = new char[STR_SIZE];
Run Code Online (Sandbox Code Playgroud)
(注意矩形[]).你必须使用delete[]运算符释放这样分配的内存块.
个人注意事项:您上面编写的代码(手动分配字符串等)具有良好的教育意义; 你会做很多这样的错误,从而了解C/C++的内部工作原理.对于您不希望的生产代码,对于您想要的生产代码std::string或其他字符串容器,以避免重复与字符串相关的错误.一般来说,你不是那个成功重塑字符串库如何工作的人.其他容器类型也是如此,例如dynamic-growable-arrays(std::vector)或字典类型等等.但是对于你的代码上面的教育摆弄是一个很好的目的.
您的代码片段中还有其他问题(移交const char*给函数然后修改ram,而不是size在调用时正确计算参数snprintf等),但这些与您的段错误问题无关.
重新技术,而不是
const char * myStr = new char(STR_SIZE);
Run Code Online (Sandbox Code Playgroud)
做
char const myStr[STR_SIZE] = "";
Run Code Online (Sandbox Code Playgroud)
请注意,两者都存在无法修改字符串的问题。
但是您仅询问分配/取消分配问题。
但是,在语言技术水平以上的水平上有很多错误。
这是原始代码,完整:
void someThirdPartyFunc(const char* someStr);
void getString(int Num, const char* myStr)
{
char tempStr[] = "MyTempString=";
int size = strlen(tempStr) + 2;
snprintf((char*)myStr, size, "%s%d", tempStr, Num);
}
int main()
{
const char * myStr = new char(STR_SIZE);
getString(1, myStr); // get the formated string by sending the number
someThirdPartyFunc(myStr); // send the string to the thirdpartyFunction
delete myStr;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是在C ++级别执行此操作的方法:
#include <string> // std::string
#include <sstream> // std::ostringstream
using namespace std;
void someThirdPartyFunc( char const* ) {}
string getString( int const num )
{
ostringstream stream;
stream << "MyTempString=" << num;
return stream.str();
}
int main()
{
someThirdPartyFunc( getString( 1 ).c_str() );
}
Run Code Online (Sandbox Code Playgroud)
在#define更自然的代码消失了,但要注意,它可以很容易导致不想要的文本替换,即使全部使用大写宏名。无论如何,喊大写都是一件令人讨厌的事情(这就是为什么它是宏名称约定而不是其他约定的原因)。在C ++中,只需使用const代替。