问题描述
我面临的问题与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
上无法正常运行,编译器指出:警告:字段精度应为'int'类型,但参数的类型为'intptr_t'(aka'long')[-Wformat]
-
如果我使用
int o;
,它可以与%.*s
配合使用,但当然并不理想,编译器会说很多:警告:隐式转换会失去整数精度:“ long”到“ int” [-Wshorten-64-to-32]
现在,这是演示代码,o
可以容纳的最大大小为500
,但是,在我的实际代码中,它可以是10,000
甚至是{{1 }}(仍然在32位int的大小内,不是吗?)
那么通过最少的更改,如何解决此最佳?
使用100,000
在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,(int) o,in);
或一次全部:
fprintf(write,(int) (p - in),in);
,
p-in
更像是ptrdiff_t
或size_t
。无论如何,在这种情况下,我会使用fwrite
:
if ((p = strstr(in,"/end/")) != NULL) {
size_t len = p - in;
fwrite(in,sizeof(char),len,write);
fclose(write);
break;
} else {
fputs(in,write);
}
然后添加错误检查。