小编chu*_*ica的帖子

使用printf()的两位小数

我正在尝试使用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)

这是为什么?

谢谢.

c c++ printf decimal

59
推荐指数
3
解决办法
18万
查看次数

如何检查两个格式字符串是否兼容?

例子:

"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 compatibility printf objective-c format-string

39
推荐指数
2
解决办法
872
查看次数

"int"和"int_fast16_t"有什么区别?

据我了解,C规范说该类型int应该是目标平台上包含至少16位的最有效类型.

那不就是C99的定义int_fast16_t吗?

也许他们只是为了保持一致而把它放在那里,因为int_fastXX_t需要另一个?

更新

总结下面的讨论:

  • 我的问题在许多方面都是错误的.C标准没有为int指定位数.它给出了必须包含的范围[-32767,32767].
  • 我开始意识到,大多数人会说,"但这个范围至少意味着16位!" 但是C不需要二进制补码(甚至是二进制)整数存储.如果他们说"16位",可能会有一些平台具有1位奇偶校验,1位符号和14位幅度,仍然"符合标准",但不满足该范围.
  • 标准没有说int是最有效的类型.除了上面的大小要求之外,int可以由编译器开发人员根据他们认为最重要的标准来决定.(速度,大小,向后兼容性等)
  • 另一方面,int_fast16_t就像向编译器提供一个提示,它应该使用对性能最佳的类型,可能以牺牲任何其他权衡为代价.
  • 同样,int_least16_t会告诉编译器使用> = 16位的最小类型,即使它会更慢.适用于保留大型阵列和空间中的空间.

示例: x86-64上的MSVC具有32位int,即使在64位系统上也是如此.MS选择这样做是因为太多人认为int总是正好是32位,因此很多ABI会破坏.但是,如果x86-64上的64位值更快,则int_fast32_t可能是64位数.(我不认为实际情况如此,但它只是证明了这一点)

c int portability c99 c89

38
推荐指数
3
解决办法
6431
查看次数

C:printf中的ptrdiff_t应该使用哪个字符?

哪些字符应该用于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)

c printf pointers

26
推荐指数
3
解决办法
5704
查看次数

如何在编译时打印结构成员的偏移量?

给定一个结构体,例如:

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- 在编译时对偏移量进行二进制搜索,但我的实际结构很大,这可能会有点麻烦。

c gcc

25
推荐指数
3
解决办法
3407
查看次数

从整数中获取每个数字

假设我有一个名为'score'的整数,如下所示:

int score = 1529587;
Run Code Online (Sandbox Code Playgroud)

现在我想要做的是使用按位运算符从得分中获取每个数字1,5,2,9,5,8,7(参见下面的编辑说明).

我很确定这可以做到,因为我曾经使用过类似的方法从十六进制颜色值中提取红绿色和蓝色值.

我该怎么做?

编辑
它不一定是按位运算符,我只是觉得它更简单.

c bitwise-operators

21
推荐指数
3
解决办法
7万
查看次数

+0.0和-0.0上的哪些操作和功能会产生不同的算术结果?

在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 floating-point

20
推荐指数
2
解决办法
1003
查看次数

scanf()跳过变量

在C中,使用scanf()参数,scanf("%d %*d", &a, &b)行为不同.只为一个变量而不是两个变量输入值!

请解释一下!

scanf("%d %*d", &a, &b);
Run Code Online (Sandbox Code Playgroud)

c scanf

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

用C打印字符串的所有排列

我正在学习回溯和递归,我坚持使用一种算法来打印字符串的所有排列.我用置换算法求解了它,但是我无法理解递归方法.我在网上搜索并找到了这段代码:

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)

这个算法基本上是如何工作的我无法理解?我甚至试过干跑!

如何应用回溯?

并且它比贝尔算法更有效地计算排列?

c string algorithm permutation

17
推荐指数
4
解决办法
5万
查看次数

uint32_t vs int作为日常编程的约定

什么时候应该使用stdint.h中的数据类型?总是使用它们作为惯例是正确的吗?设计非特定尺寸类型(如int和short)的目的是什么?

c int uint32

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