gpt4 book ai didi

c++ - 使用 vsprintf 和文件操作

转载 作者:行者123 更新时间:2023-11-28 06:08:48 27 4
gpt4 key购买 nike

#define printm(X) handleVarArgs X
void writeFile(std::string & s)
{
FILE *fp;
fopen("test.txt","w");
fputs( s.c_str(), fp );
fclose(fp);
}


void handleVarArgs( char* format, ...)
{
std::string s;
va_list args;
va_start (args, format);
vsprintf (const_cast<char *>(s.c_str()),format, args);
va_end (args);
writeFile(s);
}


const char * func() {
std::string errorLog("Kiev");
return errorLog.c_str();
}

int main()
{

printm(("My Name is %s and surname is %s and age is %d",func(),"john",25));
return 0;
}

如果我调用 writeFile() 函数,我会遇到段错误。但是当我删除 writeFile() 时没有段错误Files 和 Var Args 是什么关系?

最佳答案

您直接在 string.c_str() 中编写,只需使用 const_cast 删除其常量。这是不好的,会调用未定义的行为。所以接下来发生的只是undefined ...

handleVarArgs 的正确方法是:

  • 从堆中分配一个 bunch 内存(使用 malloc 或 new[])
  • 使用 vsnprintf 尝试在那里写
  • 如果返回值(比如 sz)大于或等于分配的大小,则释放它并重新分配一堆大小 sz+1 并迭代
  • 然后您可以从该 char 数组安全地创建一个 std::string 并使用它
  • 不要在完成 malloc 数组后调用 free(或 delete[])

类似的东西:

void handleVarArgs( char* format, ...)
{
#define DEF_SZ 256
int sz = DEF_SZ;
std::string s;
while(1) {
char * buf = new char[sz];
va_list args;
va_start (args, format);
int l = vsnprintf (buf , sz, format, args);
va_end (args);
if (l < sz) {
s = buf;
writeFile(s);
delete[] buf;
return;
}
sz = l + 1;
delete[] buf;
}
}

关于c++ - 使用 vsprintf 和文件操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31744105/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com