我面临的问题与intptr_t
数据类型有关,并且该方式fprintf()
采用了%.*s
格式的参数。该%.*s
格式期望字段精度为type 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
,编译器指出:
警告:字段精度应为'int'类型,但参数的类型为'intptr_t'(aka'long')[-Wformat]
如果我做到了int o;
,它可以很好地运行,%.*s
但是当然不是理想的,编译器会说很多:
警告:隐式转换失去整数精度:“ long”到“ int” [-Wshorten-64-to-32]
现在,这是演示代码,这里o
可以容纳的最大大小是500
,但是,在我的实际代码中,它可以是10,000
甚至是100,000
(仍然很大,仍然是32位int的大小,对吗?)
那么,如何以最少的更改来最好地解决这个问题呢?
在Clang上编译(在GCC上可能非常相似)-Wall -Wextra -pedantic
。
两个指针的区别是type 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);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句