C 摆脱到整数

C 摆脱到整数,c,C,我在最后一行得到一个“int格式,不同类型的arg(arg4)”错误。我应该直接转换为int还是有更好的方法来处理这个问题 struct stat info; if (stat(file_path, &info) == -1 || errno == ENOENT) return -1; if (stat(file_path, &info) != -1) { char buf[LINELEN]; snprintf(buf,LINELEN,"File Siz

我在最后一行得到一个“int格式,不同类型的arg(arg4)”错误。我应该直接转换为int还是有更好的方法来处理这个问题

struct stat info;
if (stat(file_path, &info) == -1 || errno == ENOENT)
    return -1;

if (stat(file_path, &info) != -1)
{
    char buf[LINELEN];
    snprintf(buf,LINELEN,"File Size: %d",info.st_size);

请改为尝试格式化%ld。这取决于您的平台,但通常off\t定义为long。也可以是未签名的,在这种情况下,请使用%lu。

尝试使用格式%ld。这取决于您的平台,但通常off\t定义为long。也可以是未签名的,在这种情况下,请使用%lu。

对于
关闭类型,应按如下方式打印:

snprintf(buf,LINELEN,"File Size: %jd",info.st_size);

请注意格式化程序中的
j

对于
off\u t
类型,应按如下方式打印:

snprintf(buf,LINELEN,"File Size: %jd",info.st_size);

请注意格式化程序中的
j

st\u size
类型为
off\u t
,这实际上是一个
长的

因此,适当的呼吁应为:

snprintf(buf,LINELEN,"File Size: %ld",info.st_size); 

st\u size
属于
off\u t
类型,它实际上是一个
长的

因此,适当的呼吁应为:

snprintf(buf,LINELEN,"File Size: %ld",info.st_size); 

不幸的是,没有为
off\u t
定义格式,该格式可能是任何带符号整数类型,具体取决于平台和某些宏(例如,这些宏规定您是否可以访问大于4 GiB的文件)。你不能依赖这些。最好是在
printf
格式中使用“j”作为长度修饰符,并将值转换为
intmax\u t

不幸的是,没有为
off\u t
定义格式,该格式可能是任何有符号整数类型,具体取决于平台和某些宏(例如,这些宏规定您是否可以访问大于4 GiB的文件)。你不能依赖这些。最好是在
printf
格式中使用“j”作为长度修饰符,并将值转换为
intmax\u t

为了安全、正确和可移植:在传递varargs(例如,传递到printf)时,如果要传递的内容在编译时可能不具有相同的类型,请始终包含显式强制转换。例如,计算出你认为的偏离可以达到多大(long应该至少和off\t一样大),然后再进行转换,确保你的printf格式接受你现在安全地知道你将要传递的long。没有类型转换的printf可能会带来麻烦。

为了安全、正确和可移植:在传递varargs(例如,传递给printf)时,如果要传递的对象在编译时可能不具有相同的类型,请始终包含显式转换。例如,计算出你认为的偏离可以达到多大(long应该至少和off\t一样大),然后再进行转换,确保你的printf格式接受你现在安全地知道你将要传递的long。没有类型转换的printf可能会带来麻烦。

j格式用于
{u}intmax\u t
。因此,您也必须强制转换为该类型才能确定。“j”格式用于
{u}intmax\t
。所以你也必须投到那种类型来确定“真的很长”?它可以是任何有符号整数类型。那么,您认为“j”修饰符会出现在所有实现中吗?假设这是一个长期的比较安全。您可以将st_大小强制转换为long,而无需任何编译器警告:
snprintf(buf,LINELEN,“文件大小:%ld”,(long)info.st_大小)snprintf(buf,LINELEN,“文件大小:%ld”,(long)info.st_大小)printf
(这让我非常难过)的不好的地方就是格式字符串的问题。假设您的代码根据某些配置将类型定义为
uint32\t
uint64\t
。你永远不能只打印这些变量。然而,解决方案,最肯定总是没有问题的工作是将参数转换为他们可以假设的最大大小。例如,在您的例子中:
printf(“%lu”,(unsigned int)info.st_size)无论大小都能正确打印。唯一的问题是,若争论比你们的演员阵容更大。你会丢失数据,但仍然避免UB。printf的坏处(这让我很难过)正是格式字符串的问题。假设您的代码根据某些配置将类型定义为
uint32\t
uint64\t
。你永远不能只打印这些变量。然而,解决方案,最肯定总是没有问题的工作是将参数转换为他们可以假设的最大大小。例如,在您的例子中:
printf(“%lu”,(unsigned int)info.st_size)无论大小都能正确打印。唯一的问题是,若争论比你们的演员阵容更大。你会丢失数据,但仍然避免UB。