标签: format-specifiers

Typedef和printf格式说明符

typedef的一个常见用途是使变量的"类型"能够更好地了解变量的用途,而无需重新定义其后面的存储结构.

但是,我也看到typedef是一种改变一类变量的存储结构的方法.

例如,如果我定义

typedef uint32_t my_offset_t
Run Code Online (Sandbox Code Playgroud)

并且具有类型的变量my_offset_t,将代码库从切换uint32_tcharuint64_t简单到更改一行和重新编译(假设我使用的sizeof而不是硬编码的大小),除了printf/scanf的情况.

有没有办法根据类型以一种简单的方式交换格式说明符,没有printf/ scanf,if-elses或ifdefs 周围的包装函数?

谢谢!

对于任何感兴趣的人,我正在修改一个使用16位偏移来处理32位偏移的LKM,但是如果需要的话,希望能够以最小的变化进行64位(或其他!)偏移.

c typedef format-specifiers

12
推荐指数
2
解决办法
5446
查看次数

在printf()字符串中命名PHP说明符

PHP中是否有一种方法可以像Python一样命名我的说明符?

我想用PHP:

$foo = array('name' => 24);
printf("%(name)d", $foo);
Run Code Online (Sandbox Code Playgroud)

我在谷歌或php手册中找不到任何相关内容.

php naming format-specifiers

11
推荐指数
3
解决办法
4281
查看次数

如何从指数表示法中删除零

我正在使用指数格式来格式化C#中的十进制数.例如,如果数字是

0.0001234567
Run Code Online (Sandbox Code Playgroud)

格式化

(0.0000123456).ToString("E4");
Run Code Online (Sandbox Code Playgroud)

展会

1.2345E-004
Run Code Online (Sandbox Code Playgroud)

如何从指数中删除前导零,使其如下所示?

1.2345E-4
Run Code Online (Sandbox Code Playgroud)

c# format-specifiers number-formatting

11
推荐指数
2
解决办法
1862
查看次数

如果我忘记关闭扫描设置会发生什么?

假设我忘了关闭]扫描仪的右方括号.那会发生什么?它会调用未定义的行为吗?

例:

char str[] = "Hello! One Two Three";
char s1[50] = {0}, s2[50] = {0};
sscanf(str, "%s %[^h", s1, s2); /* UB? */
printf("s1='%s' s2='%s'\n", s1, s2);
Run Code Online (Sandbox Code Playgroud)

我在编译时收到GCC的警告:

source_file.c: In function ‘main’:
source_file.c:11:5: warning: no closing ‘]’ for ‘%[’ format [-Wformat=]
     sscanf(str, "%s %[^h", s1, s2); /* UB? */
Run Code Online (Sandbox Code Playgroud)

和输出为

s1='Hello!' s2=''
Run Code Online (Sandbox Code Playgroud)

我也注意到了sscanf回报1.但到底是怎么回事?

我检查了C11标准,但没有找到与此相关的信息.

c scanf format-specifiers

11
推荐指数
1
解决办法
132
查看次数

C中的动态浮点格式说明符

有没有办法让用户输入浮点格式说明符?例如,如果我打印这个.

float c = 15.0123
printf("%.2f", c);

// outputs: 15.01
Run Code Online (Sandbox Code Playgroud)

如何为变量分配小数位数?喜欢:

int n = 3;
float c = 15.0123
printf("%.(%i)f", n, c);

// outputs: 15.012
Run Code Online (Sandbox Code Playgroud)

c floating-point string-formatting format-specifiers

10
推荐指数
2
解决办法
3370
查看次数

为什么scanf("%d",[...])不消耗'\n'?而scanf("%c")呢?

在这里,我在接受的答案中看到了这个陈述:

大多数转换说明符都跳过前导空格,包括换行符但%c不跳过.

对我来说,不清楚这种不同行为的基本原理,我会期待一个统一的(例如总是跳过或从不).

我用这样的一段C代码遇到了这种问题:

#include "stdio.h"

int main(void){

    char ch;
    int actualNum;

    printf("Insert a number: ");
    scanf("%d", &actualNum);
    // getchar();

    printf("Insert a character: ");
    scanf("%c", &ch);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

交换两个scanf小号解决了问题,以及在(注释)getchar,否则'\n'该第一插入将由所述第二消耗scanf%c.我在linux和windows上测试了gcc,行为是一样的:

gcc(GCC)4.7.2 20120921(Red Hat 4.7.2-2)
版权所有(C)2012 Free Software Foundation,Inc.
这是免费软件; 查看复制条件的来源.没有保修; 甚至不适用于适销性或特定用途的适用性.

所以我的问题是:为什么%d%c行为不同WRT '\n'scanf

c scanf format-specifiers

10
推荐指数
2
解决办法
4172
查看次数

%ul和%lu C格式说明符之间有什么区别?

在"C Primer Plus"的示例中,作者使用了%ul格式说明符(在scanf和printf中)用于unsigned long.当我尝试概括问题时,似乎%ul在我的计算机中出错了.但使用%lu解决了这个问题.

实际上,我不想关注问题和代码行,而是想知道%ul和之间的区别%lu.也许我可以弄清楚出了什么问题.

搜索并没有给我一些有用的东西(除了"它们是不同的").

任何解释或链接/参考表示赞赏.

c format-specifiers

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

为什么uint8_t和uint16_t的格式说明符相同(%u)?

由于大量的搜索结果,我只发现了非常不相关的问题printf().

为什么不uint8_t指定自己的格式字符串,但任何其他类型呢?

据我所知printf(),它必须知道提供的参数的长度,以便能够解析变量参数列表.

由于uint8_tuint16_t使用相同的格式说明符%u,"如何printf()"知道要处理多少字节?或者uint16_t在供应时是否存在隐含的演员uint8_t

也许我错过了一些明显的东西.

c printf format-specifiers

10
推荐指数
2
解决办法
5万
查看次数

为什么gcc -Wformat没有在unsigned int上警告printf%d?

以下程序具有未定义的行为:

#include <stdio.h>

int main(void)
{
    unsigned int x = -100; // This is fine, becomes UINT_MAX - 100
    printf("%d\n", x); // This is undefined behavior.
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

C99 7.19.6.1p8状态%d需要一个int参数.

C99 7.19.6.1p9声明"如果任何参数不是相应转换规范的正确类型,则行为 未定义."

但是,gcc -Wformat(包含在内-Wall)不会抱怨上述程序,为什么?这是一个错误,还是故意遗漏?

从gcc手册页:

-Wformat
Run Code Online (Sandbox Code Playgroud)

检查电话"printf""scanf"等,以确保提供参数指定适当的格式字符串类型,并在格式字符串指定的转换意义

c gcc gcc-warning format-specifiers format-string

9
推荐指数
1
解决办法
2467
查看次数

字符串格式化程序,用于Swift中的字符串常量?

很抱歉,如果这是重复的,但我尝试搜索包括Apple的字符串格式说明符IEEE printf规范,但找不到这个简单的答案的答案.

我想打印带字符串格式化程序的os_log消息,用于字符串常量.类似于:

printf("Currently at processing state: %s\n", "reading in");
Run Code Online (Sandbox Code Playgroud)

在C.但是,当我在Swift中尝试这样的事情时:

os_log("Currently at processing state: %s", log: .default, type: .info, "reading in")
Run Code Online (Sandbox Code Playgroud)

它根本没有印刷任何东西.

如何使用字符串格式说明符打印字符串常量?我不知道如何做到这一点NSLog.

编辑:os_log需要StaticString,所以它不能这样做"Something \(Expr) Something else"print().您仍然可以使用字符串格式来打印数字变量.我想知道在这种情况下如何打印字符串常量/变量.

编辑2:Apple实际上已经在其手册页面上讨论了这个主题,我设法错过了它,但它现在只在Objective-C API版本中讨论过.

string logging constants format-specifiers swift

9
推荐指数
1
解决办法
3387
查看次数