格式。 %.*s 格式期望字段精度具有 int 类型,也许这本身并不是不合理的。 虽然在这种情况下不-6ren">
gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 02:04:56 27 4
gpt4 key购买 nike

我面临的问题与 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com