标签: printf

如何使用GCC属性'format'?

这是一小段代码:

#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'属性. …

format printf attributes gcc warnings

13
推荐指数
1
解决办法
1万
查看次数

将变量参数列表传递给sprintf()

我想编写一个函数(除其他外)接受可变数量的参数,然后将它们传递给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中执行此操作?

php parameters printf arguments

13
推荐指数
1
解决办法
5296
查看次数

printf如何使用前导零进行浮点运算

我知道如何做X量的前导零,我知道如何做X小数点.但是,我怎么做他们两个?

我希望有4个前导零到小数精度2:0000.00.因此43.4将是0043.40

php c java perl printf

13
推荐指数
2
解决办法
8569
查看次数

为什么printf需要强制转换?

要打印多种类型off_t,建议使用以下代码:

off_t a;
printf("%llu\n", (unsigned long long)a);
Run Code Online (Sandbox Code Playgroud)
  • 为什么格式字符串是不是就够了吗?
  • 如果没有铸造会有什么问题?

c printf

13
推荐指数
2
解决办法
3675
查看次数

如何将相同的变量多次打印到字符串中?

我有一个像这样的格式字符串:

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吗?

c printf

13
推荐指数
2
解决办法
5430
查看次数

PHP中printf()函数的用途是什么?

这似乎是一个非常愚蠢的问题,但是printf()PHP中存在该函数的原因是什么?

在我看来,使用echo将获得完全相同的结果,额外的好处是,如果你在一行输出几个变量,你不会感到困惑(是的,你可以使用%1$s而不是只是%s,但它仍然可以获取所有声明的几个变量的messey).

我知道你也可以定义变量的类型,而不需要在输出字符串之前修改它,但对我来说似乎不足以创建一个函数.

也许我错了,也许我错过了一些明显的东西,但是如果有人可以帮助我理解为什么它存在(这样我就知道我是否应该真的使用它!)我会批评它.谢谢.

php printf

13
推荐指数
2
解决办法
9700
查看次数

为什么printf会返回一个值?

我知道printf返回成功时打印的负面错误或字符数.只检查此返回值的唯一原因是程序的执行在某种程度上取决于printf状态.但我想不出这个返回值有用的场景.我,从来没有检查过printf函数的返回值.

返回状态printf有用的场景是什么?

c printf

13
推荐指数
3
解决办法
4292
查看次数

C的printf和fprintf(stdout,)没有打印

这有点奇怪.我的代码没有输出我认为应该的东西.我在各个阶段添加了一些打印语句,以查看它出错的地方.依然没有.所以我在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)

c printf file-descriptor

13
推荐指数
1
解决办法
5万
查看次数

snprintf错误.sizeof的参数与destination相同

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]"

在gcc 4.8文档中,他们正在讨论这个问题:他们说:

-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)

c printf gcc

13
推荐指数
2
解决办法
1万
查看次数

用相同的变量替换Sprintf中的所有变量

是否可以使用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)

string format printf go

13
推荐指数
1
解决办法
2279
查看次数

标签 统计

printf ×10

c ×6

php ×3

format ×2

gcc ×2

arguments ×1

attributes ×1

file-descriptor ×1

go ×1

java ×1

parameters ×1

perl ×1

string ×1

warnings ×1