Bla*_*pel 4 c c++ printf variadic-functions
我写了一个自定义打印功能.我的问题是我需要返回一个,const char*因为这必须在另一个函数中使用.我根本不知道如何管理......
anotherFunction (const char* text /*Here*/, unsigned __int32 value, unsigned __int64 bigVal);
我知道以下示例/ s不能正常工作.这就是我到目前为止所尝试过的.
const char* CatchMessage (const char *message, ...)
{
va_list args;
va_start (args, message);
/*?*/
va_end (args);
return message;
}
Run Code Online (Sandbox Code Playgroud)
我只是设法在cmd中获得正确的输出,但实际上我需要它作为返回值.
void CatchMessage (const char *message, ...)
{
va_list args;
va_start (args, message);
vfprintf (stdout, message, args);
va_end (args);
}
Run Code Online (Sandbox Code Playgroud)
呼叫:
CatchMessage ("Some Input %s and %d equals to %d", randString, randNumber, secRandNumber);
Run Code Online (Sandbox Code Playgroud)
应该返回:
"Some Input stuff and 12 equals to 6"
Run Code Online (Sandbox Code Playgroud)
我一直无法找到解决方案.任何帮助,将不胜感激.
问:如何让此CatchMessage函数返回格式正确的const char*?
const返回 ( )的问题char *是你必须在某个地方有一个缓冲区。
有几种方法可以实现此目的:
malloc()这样做static缓冲区,但这将使其不可重入 - 这对多线程等不利。广告1:
void CatchMessage(char * result, size_t maxlen, const char *message, ...)
{
va_list ap;
va_start(ap, message);
vsnprintf(result, maxlen, message, ap);
va_end(ap);
}
Run Code Online (Sandbox Code Playgroud)
打电话给
char buffer[500];
CatchMessage(buffer, sizeof buffer, "Some Input %s and %d equals to %d", randString, randNumber, secRandNumber);
anotherfunction(buffer, ...)
Run Code Online (Sandbox Code Playgroud)
广告2:
char * CatchMessage(const char *message, ...)
{
size_t size = 500;
char * result = malloc(size);
if (!result) return NULL; // error handling!
while (1) {
va_list ap;
va_start(ap, message);
size_t used = vsnprintf(result, size, message, ap);
va_end(ap);
char * newptr = realloc(result, size);
if (!newptr) { // error
free(result);
return NULL;
}
result = newptr;
if (used <= size) break;
size = used;
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
打电话给
char * buffer = CatchMessage(buffer, sizeof buffer, "Some Input %s and %d equals to %d", randString, randNumber, secRandNumber);
if (!buffer) { /* error handling: no memory! */ }
anotherfunction(buffer, ...)
free(buffer); // important for avoiding memory leaks
Run Code Online (Sandbox Code Playgroud)
广告 3:
char * CatchMessage(const char *message, ...)
{
static char result[500]; // static is important here! Otherwise the memory will be freed immediately after returning.
va_list ap;
va_start(ap, message);
vsnprintf(result, sizeof result, message, ap);
va_end(ap);
return result;
}
Run Code Online (Sandbox Code Playgroud)
打电话给
char * buffer = CatchMessage(buffer, sizeof buffer, "Some Input %s and %d equals to %d", randString, randNumber, secRandNumber);
anotherfunction(buffer, ...)
Run Code Online (Sandbox Code Playgroud)
没有其他选择,尤其是不定义
char result[500];
Run Code Online (Sandbox Code Playgroud)
在函数中然后返回它:该数组位于堆栈中,并在返回后立即释放。调用者无法安全地访问它;它的内容只是未定义。
| 归档时间: |
|
| 查看次数: |
2157 次 |
| 最近记录: |