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