我正在尝试使用printf()以下方法将数字写入两位小数:
#include <cstdio>
int main()
{
printf("When this number: %d is assigned to 2 dp, it will be: 2%f ", 94.9456, 94.9456);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我运行该程序时,我得到以下输出:
# ./printf
When this number: -1243822529 is assigned to 2 db, it will be: 2-0.000000
Run Code Online (Sandbox Code Playgroud)
这是为什么?
谢谢.
例子:
"Something %d" and "Something else %d" // Compatible
"Something %d" and "Something else %f" // Not Compatible
"Something %d" and "Something %d else %d" // Not Compatible
"Something %d and %f" and "Something %2$f and %1$d" // Compatible
Run Code Online (Sandbox Code Playgroud)
我认为应该有一些C功能,但我没有得到任何相关的搜索结果.我的意思是编译器正在检查格式字符串和参数是否匹配,因此已经编写了用于检查它的代码.唯一的问题是我怎么称呼它.
我正在使用Objective-C,所以如果有一个Objective-C特定的解决方案也没关系.
据我了解,C规范说该类型int应该是目标平台上包含至少16位的最有效类型.
那不就是C99的定义int_fast16_t吗?
也许他们只是为了保持一致而把它放在那里,因为int_fastXX_t需要另一个?
更新
总结下面的讨论:
示例: x86-64上的MSVC具有32位int,即使在64位系统上也是如此.MS选择这样做是因为太多人认为int总是正好是32位,因此很多ABI会破坏.但是,如果x86-64上的64位值更快,则int_fast32_t可能是64位数.(我不认为实际情况如此,但它只是证明了这一点)
哪些字符应该用于ptrdiff_t在printf?
请问C标准明确说明如何打印ptrdiff_t的printf?我还没找到任何人.
int a = 1;
int b = 2;
int* pa = &a;
int* pb = &b;
ptrdiff_t diff = b - a;
printf("diff = %?", diff); // % what?
Run Code Online (Sandbox Code Playgroud) 给定一个结构体,例如:
struct A {
char a;
char b;
} __attribute__((packed));
Run Code Online (Sandbox Code Playgroud)
我希望在编译时打印结构中的偏移量b(在本例中为 1) - 我不想运行程序并调用类似的内容,printf("%zu", offsetof(struct A, b));因为打印在我的平台上并不简单。我希望编译器本身打印偏移量,例如:
> gcc main.c
The offset of b is 1
Run Code Online (Sandbox Code Playgroud)
我尝试了几种使用#pragma messageand的方法offsetof,其中最接近的是:
#define OFFSET offsetof(struct A, b)
#define XSTR(x) STR(x)
#define STR(x) #x
#pragma message "Offset: " XSTR(OFFSET)
Run Code Online (Sandbox Code Playgroud)
它只打印:
> gcc main.c
main.c:12:9: note: #pragma message: Offset: __builtin_offsetof (struct A, b)
Run Code Online (Sandbox Code Playgroud)
它不打印数字偏移量。可以使用_Static_assert- 在编译时对偏移量进行二进制搜索,但我的实际结构很大,这可能会有点麻烦。
假设我有一个名为'score'的整数,如下所示:
int score = 1529587;
Run Code Online (Sandbox Code Playgroud)
现在我想要做的是使用按位运算符从得分中获取每个数字1,5,2,9,5,8,7(参见下面的编辑说明).
我很确定这可以做到,因为我曾经使用过类似的方法从十六进制颜色值中提取红绿色和蓝色值.
我该怎么做?
编辑
它不一定是按位运算符,我只是觉得它更简单.
在C中,当±0.0支持-0.0或+0.0分配给a时double通常不会产生算术差异.尽管它们具有不同的位模式,但它们在算术上比较相同.
double zp = +0.0;
double zn = -0.0;
printf("0 == memcmp %d\n", 0 == memcmp(&zn, &zp, sizeof zp));// --> 0 == memcmp 0
printf("== %d\n", zn == zp); // --> == 1
Run Code Online (Sandbox Code Playgroud)
受到@Pascal Cuoq评论的启发,我正在寻找标准C中的一些功能,这些功能提供了算术上不同的结果.
注意:许多功能,如sin(),返回+0.0从f(+0.0)和-0.0从f(-0.0).但这些并不能提供不同的算术结果.这两个结果也不应该同时存在NaN.
在C中,使用scanf()参数,scanf("%d %*d", &a, &b)行为不同.只为一个变量而不是两个变量输入值!
请解释一下!
scanf("%d %*d", &a, &b);
Run Code Online (Sandbox Code Playgroud) 我正在学习回溯和递归,我坚持使用一种算法来打印字符串的所有排列.我用置换算法求解了它,但是我无法理解递归方法.我在网上搜索并找到了这段代码:
void permute(char *a, int i, int n)
{
int j;
if (i == n)
printf("%s\n", a);
else
{
for (j = i; j <= n; j++)
{
swap((a+i), (a+j));
permute(a, i+1, n);
swap((a+i), (a+j));
}
}
}
Run Code Online (Sandbox Code Playgroud)
这个算法基本上是如何工作的我无法理解?我甚至试过干跑!
如何应用回溯?
并且它比贝尔算法更有效地计算排列?
什么时候应该使用stdint.h中的数据类型?总是使用它们作为惯例是正确的吗?设计非特定尺寸类型(如int和short)的目的是什么?