C 将指针差与printf(";%.*s";一起使用)

C 将指针差与printf(";%.*s";一起使用),c,pointers,integer,printf,format-specifiers,C,Pointers,Integer,Printf,Format Specifiers,我面临的问题与intptr\t数据类型以及fprintf()为%.*s格式获取参数的方式有关。%.*s格式希望字段精度具有类型int,这本身可能并不不合理 但在这种情况下并非如此: #包括 #包括 int main(){ char fname[]=“Some_File.txt”; 文件*write=fopen(fname,“w”); 如果(写入!=NULL){ printf(“\n\t在下面键入:\n\n”); [501]中的字符=“”;字符*p; 而(1){ fgets(英寸、最大英寸、标准英

我面临的问题与
intptr\t
数据类型以及
fprintf()
%.*s
格式获取参数的方式有关。
%.*s
格式希望字段精度具有类型
int
,这本身可能并不不合理

但在这种情况下并非如此:

#包括
#包括
int main(){
char fname[]=“Some_File.txt”;
文件*write=fopen(fname,“w”);
如果(写入!=NULL){
printf(“\n\t在下面键入:\n\n”);
[501]中的字符=“”;字符*p;
而(1){
fgets(英寸、最大英寸、标准英寸);
/***具有编译器警告的区域开始***/
如果((p=strstrstr(in,“/end/”)!=0){
intptr_t o=p-in;
fprintf(写入,'%s',o,in);
/***具有编译器警告的区域结束***/
fclose(写入);
打破
}
否则{
fputs(in,write);
}
}
}
}
  • 如果我编译它,它与
    %.*s
    的关系就不好,编译器指出:

    警告:字段精度的类型应为“int”,但参数的类型为“intptr_t”(又名“long”)[-Wformat]

  • 如果我让它
    into,它与
    %.*s
    配合得很好,但当然并不理想,编译器也这么说:

    警告:隐式转换将丢失整数精度:“long”到“int”[-Wshorten-64-to-32]

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

那么,如何以最少的更改来最好地解决这个问题呢


使用
-Wall-Wextra-pedantic
p-in
在Clang上编译(在GCC上可能非常类似)更像是
ptrdiff\u t
size\u t
。无论如何,在这种情况下,我会使用
fwrite

if((p=strstrstr(in,“/end/”)!=NULL){
尺寸长度=p-in;
fwrite(in,sizeof(char),len,write);
fclose(写入);
打破
}否则{
fputs(in,write);
}

然后添加错误检查。

两个指针的区别在于类型
ptrdiff\u t
。“…是减去两个指针的结果的有符号整数类型;”

考虑到[501]
中的
字符中的这两个点,差异也适用于
int

简单地投。
*
需要匹配的
int
,而不是
intptr\u t
ptrdiff\u t

// fprintf(write,"%.*s",o,in);
fprintf(write,"%.*s", (int) o, in);
或者一下子:

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

intptr\u t o;=p-in
是一个语法错误,那么这可能与实际代码相差多远呢?@Ry-这是实际代码的一个片段,带有一个小的
Ctrl
-
C
&
Ctrl
-
V
错误实际代码声明了这些语句上方的变量,所以这不是问题!(我已经在这里更正了,谢谢)你不能只做
*p=0
然后只使用
%s
?@RetiredInja我不知道你在说什么mean@RetiredNinja我在这里使用它,它非常出色。但是,在另一个地方,我不能终止或覆盖我的字符串(在这里我替换一行中的短语),这可能是一种不好的地方。不过,就有关守则而言,这是可行的做法solution@user13863346:我想说,
fprintf
%.*s
通常在这里不是个好主意,是的,但当它是整个格式字符串时尤其如此。那么就没有理由不使用
fwrite
。区别在于ptrdiff\u t,never size\u t是一种无符号类型!!而这两个甚至不需要是相同的width@AnttiHaapala:在这种情况下,已知结果是一个大小。标准对
int
的大小有何规定?真正的代码使用一个大小为
10000
的字符串,因此这应该可以移植到int中,对吗?@user13863346根据C规范,
int
的范围至少为[-32767…32767],今天通常是4字节,范围为+/-(2^31-1)。按照别处的建议,使用printf()fwrite()进行编码。最好使用使代码最容易理解的东西。
fprintf(write,"%.*s", (int) (p - in), in);