这是一小段代码:
#include <stdio.h>
#include <stdarg.h>
void MyPrintf(char const* format, va_list args);
void MyVariadicPrintf(char const* format, ...);
void MyPrintf(char const* format, va_list args)
{
vprintf(format, args);
}
void MyVariadicPrintf(char const* format, ...)
{
va_list args;
va_start(args, format);
MyPrintf(format, args);
va_end(args);
}
int main(int, char*)
{
MyVariadicPrintf("%s" /* missing 2nd argument */);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我正在使用GCC 4.0编译它,在Mac OS X Leopard上运行Xcode.
-Wformat和-Wmissing-format-attribute已启用.
此代码在第9行(调用vprintf)上发出警告,建议MyPrintf可以使用'format'属性:
函数可能是'printf'格式属性的候选者
所以我以这种方式添加属性(不确定这是否正确):
void MyPrintf(char const* format, va_list args) __attribute__((format(printf, 1, 0)));
Run Code Online (Sandbox Code Playgroud)
之前的警告消失,同样的警告现在出现在第16行(呼叫MyPrintf)上,表明MyVariadicPrintf可以使用'format'属性. …
我想编写一个函数(除其他外)接受可变数量的参数,然后将它们传递给sprintf().
例如:
<?php
function some_func($var) {
// ...
$s = sprintf($var, ...arguments that were passed...);
// ...
}
some_func("blah %d blah", $number);
?>
Run Code Online (Sandbox Code Playgroud)
我如何在PHP中执行此操作?
我知道如何做X量的前导零,我知道如何做X小数点.但是,我怎么做他们两个?
我希望有4个前导零到小数精度2:0000.00.因此43.4将是0043.40
要打印多种类型off_t,建议使用以下代码:
off_t a;
printf("%llu\n", (unsigned long long)a);
Run Code Online (Sandbox Code Playgroud)
我有一个像这样的格式字符串:
buf[] = "A%d,B%d,C%d,D%d,F%d,G%d,H%d,I%d,J%d";
Run Code Online (Sandbox Code Playgroud)
我想为每个插入相同的整数,%d所以我使用:
int val = 6;
sprintf(buf2, buf, val,val,val,val,val,val,val,val,val);
Run Code Online (Sandbox Code Playgroud)
我可以使用sprintf只需要我写val一次的方式,并将sprintf每个使用它%d吗?
这似乎是一个非常愚蠢的问题,但是printf()PHP中存在该函数的原因是什么?
在我看来,使用echo将获得完全相同的结果,额外的好处是,如果你在一行输出几个变量,你不会感到困惑(是的,你可以使用%1$s而不是只是%s,但它仍然可以获取所有声明的几个变量的messey).
我知道你也可以定义变量的类型,而不需要在输出字符串之前修改它,但对我来说似乎不足以创建一个函数.
也许我错了,也许我错过了一些明显的东西,但是如果有人可以帮助我理解为什么它存在(这样我就知道我是否应该真的使用它!)我会批评它.谢谢.
我知道printf返回成功时打印的负面错误或字符数.只检查此返回值的唯一原因是程序的执行在某种程度上取决于printf状态.但我想不出这个返回值有用的场景.我,从来没有检查过printf函数的返回值.
返回状态printf有用的场景是什么?
这有点奇怪.我的代码没有输出我认为应该的东西.我在各个阶段添加了一些打印语句,以查看它出错的地方.依然没有.所以我在main的开头添加了一个printf语句.这就是我真的很困惑的地方.
所以我假设文件描述符发生了一些有趣的事情.我改成printf了fprintf.依然没有.打印到stderr fprintf确实有效!为什么会这样?
除了初始打印语句之外,从main中删除所有主体并返回打印.
int main(void) {
fprintf(stdout, "STARTED!");
//Create an Internet domain socket
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
//If this fails exit and print the error
if (sockfd == -1) {
printf("Error %d, cannot create socket", errno);
return 1;
}
printf("SOCKET CREATED!");
//Creates a socket address
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(8080);
addr.sin_addr.s_addr = INADDR_ANY;
//Attempts to bind to the socket address, again prints to error if this fails. …Run Code Online (Sandbox Code Playgroud) gcc 4.8在构建时给我一个错误
#include <string.h>
#include <stdio.h>
static inline void toto(char str[3])
{
snprintf(str, sizeof(str), "XX");
}
int main(){
char str[3];
toto(str);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是gcc错误
错误:'snprintf'调用中'sizeof'的参数与目标的表达式相同; 你的意思是提供一个明确的长度?
注意:我使用-Wall -Werror标志将警告转换为错误.
这里有类似的东西 在评论中,有人回答了这个问题
"对于固定长度缓冲区,我通常使用strncpy(dest,src,sizeof(dest)); dest [sizeof(dest)-1] ='\ 0';这保证了NULL终止,并且比snprintf更麻烦更不用说了许多人使用snprintf(dest,sizeof(dest),src);相反,当他们的程序任意崩溃时,他们会非常惊讶."
但这是错误的:gcc 4.8说
"错误:'strncpy'调用中'sizeof'的参数与目标的表达式相同;你的意思是提供一个显式长度吗?[-Werror = sizeof-pointer-memaccess]"
-Wall的行为已更改,现在包含新的警告标志-Wsizeof-pointer-memaccess.这可能会导致代码中的新警告与以前版本的GCC一起干净地编译.
例如,
include string.h
struct A { };
int main(void)
{
A obj;
A* p1 = &obj;
A p2[10];
memset(p1, 0, sizeof(p1)); // error
memset(p1, 0, sizeof(*p1)); // ok, dereferenced
memset(p2, 0, sizeof(p2)); // ok, array …Run Code Online (Sandbox Code Playgroud) 是否可以使用fmt.Sprintf()相同的值替换格式化字符串中的所有变量?
就像是:
val := "foo"
s := fmt.Sprintf("%v in %v is %v", val)
Run Code Online (Sandbox Code Playgroud)
哪会回来
"foo in foo is foo"
Run Code Online (Sandbox Code Playgroud)