printf和vprintf函数系列之间有什么区别,什么时候应该使用另一个?

Car*_*ers 51 c

据我了解,之间的差别printf,fprintf,sprintf等功能和vprintf,vfprintf,vsprintf等功能,与他们如何应对函数的参数做.但具体怎么样?有没有理由使用一个而不是另一个?我是否应该总是使用printf,因为在C中看起来更常见,或者是否有合理的理由选择vprintf

Chr*_*utz 72

printf()和朋友是正常使用的.vprintf()和朋友一起想要写自己喜欢printf()的功能.假设您要编写一个函数来打印错误:

int error(char *fmt, ...)
{
    int result;
    va_list args;
    va_start(args, fmt);
    // what here?
    va_end(args);
    return result;
}
Run Code Online (Sandbox Code Playgroud)

你会发现,你不能传递argsprintf(),因为printf()需要很多参数,而不是一个va_list参数.vprintf()但是,这些函数确实采用了va_list参数而不是可变数量的参数,所以这里是完成的版本:

int error(char *fmt, ...)
{
    int result;
    va_list args;
    va_start(args, fmt);
    fputs("Error: ", stderr);
    result = vfprintf(stderr, fmt, args);
    va_end(args);
    return result;
}
Run Code Online (Sandbox Code Playgroud)

  • 当然,那么你需要一个`warn()`函数,它的作用类似于`error()`而是打印"Warning:",所以你创建了你的_own_`vprintf()`样式函数:`int verror(char*prefix, char*fmt,va_list args);`并且``error()`调用"Error:"和`warn()`用"Warning:"调用它,但它都是语义. (3认同)
  • 是时候学习可变参数功能了!这个答案使事情变得清晰起来,谢谢。 (2认同)

unw*_*ind 15

你永远不想vprintf()直接使用,但是当你需要包裹时它非常方便printf().对于这些情况,您将使用变量参数(...)定义顶级函数.然后你会收集这些成va_list,做你的处理,最后调用vprintf()va_list获得印出发生.