printf格式错误

时间:2010-11-06 05:00:35

标签: c

  

可能重复:
  How should I print types like off_t and size_t?

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <errno.h>

int main(int argc, char *argv[])
{
    int fd, offset;
    char *data;
    struct stat sbuf;
    int counter;

    if (argc != 2)
    {
        fprintf(stderr, "usage: mmapdemo offset\n");
        exit(1);
    }

    if ((fd = open("mmapdemo.c", O_RDONLY)) == -1)
    {
        perror("open");
        exit(1);
    }
    offset = atoi(argv[1]);
    if (offset < 0 || offset > sbuf.st_size-1)
    {
        fprintf(stderr, "mmapdemo: offset must be in the range 0 - %d \n",
          sbuf.st_size-1);
        exit(1);
    }

    data = mmap((caddr_t)0, sbuf.st_size, PROT_READ, MAP_SHARED, fd, 0);

    if (data == (caddr_t)(-1))
    {
        perror("mmap");
        exit(1);
    }

    // print the while file byte by byte

    while(counter++<=sbuf.st_size)
        printf("%c", *data++);
   return 0;
}

当我运行此代码时,它会给出错误

gcc mmap.c -o mmap mmap.c:在函数'main'中: mmap.c:38:警告:格式'%d'需要类型'int',但参数3的类型为'long int'

请告诉我,为什么会这样?

4 个答案:

答案 0 :(得分:3)

我相信你错过了代码。

但是,在你的一个printf语句中,你使用的是%d标志,但是仍然需要使用%ld。

编辑:

继承人的错误:

    fprintf(stderr, "mmapdemo: offset must be in the range 0 - %d \n",
      sbuf.st_size-1);

应该是:

    fprintf(stderr, "mmapdemo: offset must be in the range 0 - %ld \n",
      sbuf.st_size-1);

答案 1 :(得分:1)

您的代码未正确显示。你得到的错误只是一个警告。这意味着您使用了错误的格式字符串。对于long int,您可能应该使用%ld。

答案 2 :(得分:1)

使用%ld

嗯,您发布的代码段看起来并不像它有38行,但您引用的错误来自使用格式%d而不是%ld或其中一个相关的C99符号格式。

好的,现在发布了更多代码。虽然st_size在技术上是off_t,而且off_t没有C99格式说明符,但%zd会打印size_t并符合C99。这可能是你最好的。

然而,实际上,%ld也会起作用,是可以接受的选择。

更新:好的,我正在为您提供有关编译程序的建议,但 R 指出便携式程序至少应该运行ILP32,LP64和LLP64,因此在这种情况下必须转换为格式中的任何类型,如果您希望所有64位实际打印在所有这些系统上,那么唯一的选择是{{ 1}}和强制转换为%lld

答案 3 :(得分:0)

此:

fprintf(stderr, "mmapdemo: offset must be in the range 0 - %d \n",sbuf.st_size-1);

应该是:

fprintf(stderr, "mmapdemo: offset must be in the range 0 - %ld \n",sbuf.st_size-1);