如何打印struct timeVal

如何打印struct timeVal,c,sockets,unix,gcc,gcc-warning,C,Sockets,Unix,Gcc,Gcc Warning,我的代码中有这一行 `printf("Rcvd pkt from %s:%d at <%ld.%06ld>\n", inet_ntoa(servAddr.sin_addr), ntohs(servAddr.sin_port), timeVal.tv_sec, timeVal.tv_usec);` 我做错了什么 PS-我已经包括了time.h和sys/time.h请参见suseconds\u t的解释。显然是的 一种有符号整数类型,能够存储至少在[-1000000]范围内的值 这意

我的代码中有这一行

`printf("Rcvd pkt from %s:%d at <%ld.%06ld>\n", inet_ntoa(servAddr.sin_addr),  ntohs(servAddr.sin_port), timeVal.tv_sec, timeVal.tv_usec);`
我做错了什么

PS-我已经包括了
time.h
sys/time.h

请参见
suseconds\u t
的解释。显然是的

一种有符号整数类型,能够存储至少在[-1000000]范围内的值

这意味着它可能在您的系统上定义为
int
。尝试从格式字符串中删除长说明符
l
,并将其作为常规小数打印

编辑


根据rra的回答,这将是不可移植的。它只适用于以相同方式定义
suseconds\t
的系统。我们从规范中知道,该类型是至少32位的有符号整数类型。最可移植的方法是将其强制转换为可以忽略的最大有符号整数固有值。

struct timeval的成员类型因系统而异。与许多其他C数据类型一样,安全且可移植的做法是在打印时强制转换值:

printf("Rcvd pkt from %s:%d at <%ld.%06ld>\n",
    inet_ntoa(servAddr.sin_addr),  ntohs(servAddr.sin_port),
    (long) timeVal.tv_sec, (long) timeVal.tv_usec);
printf(“来自%s的Rcvd pkt:%d at\n”,
inet_ntoa(servAddr.sin_地址),ntohs(servAddr.sin_端口),
(长)时间值电视秒,(长)时间值电视秒);
对于大小小于或等于long的任何数据类型,这将正常工作。这种习惯用法非常普遍,人们会三思而后行,将这些常见的数据类型中的任何一种设置为比long更长,尽管要注意引用文件大小的数据类型(如off\t);在某些情况下,它们可能是长的


为了最大限度地安全,您可以转换为
long-long
并使用
%lld
格式,但这会将一个可移植性问题转换为另一个,因为并非所有
printf
实现都支持
%lld
。我还没有看到一个实现需要对这些时间值进行处理。

将数字转换为正确的类型:

printf("Rcvd pkt from %s:%d at <%ld.%06ld>\n", inet_ntoa(servAddr.sin_addr),  ntohs(servAddr.sin_port), (long int)(timeVal.tv_sec), (long int)(timeVal.tv_usec));
printf(“来自%s的Rcvd pkt:%d at\n”、inet_ntoa(servAddr.sin_addr)、ntohs(servAddr.sin_port)、(long int)(timeVal.tv_sec)、(long int)(timeVal.tv_usec));

谢谢大家。将其转换为long int有效。为什么我们不能在所有的系统中标准化这些呢?主要是因为C语言的目的是可以移植到相当广泛的系统中。它在最大数据大小为32位和128位或更大的系统上运行。对于64位系统,您需要一个64位
时间和相关类型(这样您就不会在2038年耗尽时间),但最初为C编写的系统无法(轻松地)处理如此大的数据类型。
printf("Rcvd pkt from %s:%d at <%ld.%06ld>\n", inet_ntoa(servAddr.sin_addr),  ntohs(servAddr.sin_port), (long int)(timeVal.tv_sec), (long int)(timeVal.tv_usec));