标签: format-specifiers

奇怪的C fprintf格式表示法

当我注意到这段代码时,试图弄清楚函数中的堆栈损坏错误:

fprintf( fp, "\n%s %3c %12s %2c %12s %2c %12s %2c %12s %2c"
             "%12s %2c %12s", 
             xys_field[3],      x,
             xyzFunc(val1, 0),  x, 
             xyzFunc(val2, 0),  x, 
             xyzFunc(val3, 0),  x,
             xyzFunc(val4, 0),  x, 
             xyzFunc(val5, 0),  x, 
             xyzFunc(val6,0) );
Run Code Online (Sandbox Code Playgroud)

我问的是关于这一行"\n%s %3c %12s %2c %12s %2c %12s %2c %12s %2c" "%12s %2c %12s",我甚至不明白这是如何编译的,因为我从未见过两种格式如此相互跟随.谢谢你的帮助.

c printf format-specifiers

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

"%-9s"有什么作用?

我正在开发一个C项目,现在使用开源方法集成到我的代码中.在浏览代码时,我遇到了一个类似这样的printf语句:

printf("%-9s",someString);
Run Code Online (Sandbox Code Playgroud)

我理解格式说明符%s但是什么是%9s

我试图寻找解决方案,但没有成功.任何帮助都会有用.

c format-specifiers

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

MISRA C 2004 10.1,printf"%x"的签名

我从静态分析工具中收到有关以下代码段的错误:

uint8_t value = 24U;
char buffer[512];
int chars_printed = snprintf(buffer, sizeof(buffer),
                             "The value in hex is 0x%02hhX\r\n",
                             value);
Run Code Online (Sandbox Code Playgroud)

错误是:

MISRA-2004规则10.1违规:隐式转换函数参数中的非常量表达式.将"value"与基础类型"unsigned char"(8位,无符号)转换为类型"int"(32位,有符号).

MISRA期望从"%X"说明符获得的签名和位宽是多少?

据说"%X" unsigned int来自cppreference页面.

IAR编译器的MISRA C 2004检查程序没有错误.
这个来自Coverity.

c printf type-conversion misra format-specifiers

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

没有参数的`printf("%p")`是什么意思?

我当然知道它用于输出带参数的指针.

我读过迈克尔霍华德和大卫勒布朗的书" 编写安全代码".

书中的一个程序演示了堆栈溢出是如何工作的 strcpy()

注意printf()没有参数.

#include <stdio.h>
#include <string.h>

void foo(const char* input)
{
    char buf[10];

    //What? No extra arguments supplied to printf?
    //It's a cheap trick to view the stack 8-)
    //We'll see this trick again when we look at format strings.
    printf("My stack looks like:\n%p\n%p\n%p\n%p\n%p\n% p\n\n");

    //Pass the user input straight to secure code public enemy #1.
    strcpy(buf, input);
    printf("%s\n", buf);

    printf("Now the stack looks like:\n%p\n%p\n%p\n%p\n%p\n%p\n\n");
}

void bar(void)
{
    printf("Augh! I've been hacked!\n"); …
Run Code Online (Sandbox Code Playgroud)

c printf format-specifiers

2
推荐指数
3
解决办法
903
查看次数

`l`长度修饰符对后续的a,A,e,E,f,F,g或G转换说明符没有影响

我想了解以下部分:

l (ell)

用于指定后续的d,i,o,u,x,或X转换说明适用于一个longunsigned long参数; 以下n转换说明符适用于指向long 参数的指针; 以下c转换说明符适用于wint_t 参数; 以下s转换说明符适用于指向wchar_t参数的指针; 或具有在下文中没有任何影响a,A,e,E,f, F,g,或G转换说明.

我还可以看到这与cppreference一致:fprintf在哪里"%f""%lf"等同于printf()家庭.

那么,这个答案错误?或是否C99清楚,现在"%f"float,虽然"%lf"double针对printf() …

c printf c99 format-specifiers language-lawyer

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

如何控制双变量的小数点字符后出现的位数?

我想打印n一些数据类型时打印十进制后的位数double.但是,n必须从用户使用获得整数scanf().

double pi = acos(-1);
int n;
printf("\nEnter the number of decimal digits required : ");
scanf("%d",&n);
Run Code Online (Sandbox Code Playgroud)

现在,如何使用printf()打印npi的十进制数字?

c double printf format-specifiers

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

printf格式说明符中的索引说明

在以下程序中,printf()函数根据参数索引规范进行打印。

#include <stdio.h>

int main()
{
        printf("%3$d  %4$f  %2$d  %1$d\n", 1,  2,  3,  4.5);
}
Run Code Online (Sandbox Code Playgroud)

输出:

3  4.500000  2  1
Run Code Online (Sandbox Code Playgroud)

所以,我有一个问题,它对任何编译器有效还是仅支持GCC编译器?

c indexing printf format-specifiers

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

printf%s segfaulting - 为什么?

我希望这会是我的argv的最后一个字母[1]:

$ cat input_string_fu.c 
#include <stdio.h>

int main(int argc, char *argv[])
{
    if (argc !=2){
       printf("Error: Invalid syntax\n");
       return 1;
    };

    int a;
    a = strlen(argv[1]);
    if (a >= 2){
        printf("Last char of %s : %c\n", argv[1], argv[1][a-1] );
        printf("Last char of %s : %s\n", argv[1], argv[1][a-1] );
    } 
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我很困惑为什么printf("%s")在argv [1] [a-1] segfaulting上.

$ ./a.out stackoverflow
Last char of stackoverflow : w
Segmentation fault
$ 
Run Code Online (Sandbox Code Playgroud)

感谢您的时间和专业知识!

编辑1:

感谢您的指导.TIL,printf("%s\n", argv[1][a-1]);是segfaulting,因为printf中的%s格式规范要求相应的参数是一个空终止的char数组.

或者,(1)传递一个指针:

printf("%s\n", &argv[1][a-1]);
Run Code Online (Sandbox Code Playgroud)

或者,如: …

c segmentation-fault format-specifiers

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

格式说明符C++有什么问题

我有以下代码:

#include <cstdio>

int main()
{
    float b = 323.23f;
    std::scanf("%6.3f\n", &b);  // <-- Warning
    std::printf("%6.3f\n", b);
}
Run Code Online (Sandbox Code Playgroud)

有一个警告scanf()说:

转换说明符无效 '.'

这里有什么我想念的吗?

c++ scanf format-specifiers

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

格式说明符,用于更改前导零的大小

我当时想解决以下问题,然后以一个我无法在Google上找到答案的问题结束。

问题:是否可以在printf()的另一个格式说明符内使用格式说明符?

问题在于以下代码行中printf()中前导零的大小:

uint16_t num=5;
printf("%02d",num);
Run Code Online (Sandbox Code Playgroud)

是否可以为该“ 2”使用格式说明符?如何根据不同的条件(例如%02d,%03d,%04d等)调整程序中前导零的大小?除了定义不同的类别和不同的printf()行之外,是否可以在此处使用技巧?是否有其他功能而不是printf()来解决此问题?

c printf format-specifiers

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