在printf“%* s”

问题描述

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

// fprintf(write,"%.*s",o,in);
fprintf(write,(int) o,in);

或一次全部:

fprintf(write,(int) (p - in),in);
,

p-in更像是ptrdiff_tsize_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);
}

然后添加错误检查。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...