c - 使用指针的差异与 printf ("%.*s")

标签 c pointers integer printf format-specifiers

我面临的问题与 intptr_t 数据类型和 fprintf() 接受 %.*s 参数的方式有关> 格式。 %.*s 格式期望字段精度具有 int 类型,也许这本身并不是不合理的。

虽然在这种情况下不是:

#include <stdio.h>
#include <stdint.h>

int main() {
    char fname[] = "Some_File.txt";
    FILE *write = fopen(fname, "w");
    
    if (write != NULL) {

        printf("\n\tType below :\n\n");
        char in[501] = ""; char *p;

        while (1) {
            fgets(in, MAX_LN, stdin);

    /*** Region with compiler warnings begins ***/
            if ((p = strstr(in, "/end/")) != 0) {
                intptr_t o = p - in;
                fprintf(write, "%.*s", o, in);
    /*** Region with compiler warnings ends ***/
                fclose(write);
                break;
            } else {
                fputs(in, write);
            }
        }
    }
}
  • 如果我编译它,它不能很好地与 %.*s 一起运行,编译器指出:

    warning: field precision should have type 'int', but argument has type 'intptr_t' (aka 'long') [-Wformat]

  • 如果我让它成为 int o;,它可以很好地与 %.*s 一起使用,但当然不是理想的,编译器也这么说:

    warning: implicit conversion loses integer precision: 'long' to 'int' [-Wshorten-64-to-32]

现在,这是演示代码,o 可以容纳的最大大小在这里是 500,但是,在我的实际代码中,它可以是 10,000 甚至 100,000(仍然非常接近 32 位 int 的大小,不是吗?)

那么,如何用最少 的改变解决这个最好的

使用 -Wall -Wextra -pedantic 在 Clang 上编译(在 GCC 上可能非常相似)。

最佳答案

两个指针的区别是类型ptrdiff_t。 "...是两个指针相减结果的有符号整数类型;"

// intptr_t o = p-in;
ptrdiff_t o = p - in;

鉴于这两个点都在 char in[501] 中,差异也适合 int
简单地投。 .* 需要匹配 int,而不是 intptr_tptrdiff_t

// fprintf(write,"%.*s",o,in);
fprintf(write,"%.*s", (int) o, in);

或者一次全部:

fprintf(write,"%.*s", (int) (p - in), in);

关于c - 使用指针的差异与 printf ("%.*s"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63856832/

相关文章:

无法在结构中存储值(C 套接字编程中的服务器)

计算数字中零组位的数量

c - Rust C 互操作段错误(斜线 STATUS_ACCESS_VIOLATION)

c - 带有函数指针的 Memcpy 会导致段错误

java - 了解 Java 随机下一个整数与绑定(bind)算法

haskell - 当输入值是Haskell中的Float类型而不是Integer类型时,如何创建错误消息

c - 我究竟该如何使用 makefile?

c - 在 OpenGL 中绘制二维纹理

c++ - 在头文件中将变量声明为指针和非指针的区别

hadoop - 是否可以将整数编码为字节数组以进行二进制比较