#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之间有什么关系?
答案 0 :(得分:1)
您直接在string.c_str()
中编写,只需使用const_cast删除其常量即可。这是错误并调用未定义的行为。接下来发生的事情就是 undefined ......
handleVarArgs的正确方法是:
sz+1
并迭代std::string
并使用它类似的东西:
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;
}
}
答案 1 :(得分:0)
打开文件后fp
的值是多少?
它与打开文件前的值有何关系?
调试器是你最好的朋友。
应为:FILE *fp = fopen("test.txt","w");
没有提到你应该检查fopen
成功了。