C printf предупреждение компилятора - PullRequest
0 голосов
/ 06 ноября 2010
#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);
    }

    if (stat("mmapdemo.c", &sbuf) == -1) {
     perror("stat");
        exit(1);
    }

    offset = atoi(argv[1]);
    if (offset < 0 || offset > sbuf.st_size-1) {
        fprintf(stderr, "mmapdemo: offset must be in the range 0-%ld\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 mmapdemo.c -o mmapdemo
mmapdemo.c: In function 'main':
mmapdemo.c:48: warning: format '%c' expects type 'int', but argument 2 has type 'char *'

Пожалуйста, помогите мне решить проблему.

Ответы [ 2 ]

4 голосов
/ 06 ноября 2010
printf("%c", *data++);

data является char *. Спецификатор формата %c указывает printf ожидать char. Чтобы получить char из char *, вам нужно разыменовать указатель с помощью оператора *.

Тем не менее ваша программа по-прежнему не будет работать должным образом, поскольку вы не увеличиваете counter в цикле печати и не инициализируете его. Я бы пошел с:

for (size_t i = 0; i < sbuf.st_size; ++i) {
    printf("%c", data[i]);
}

вместо этого. Я не проверял остальную часть вашей программы, но, учитывая, что в трех строчках, на которые я смотрел, было три серьезных ошибки, я сомневаюсь, что остальная часть не содержит ошибок.

2 голосов
/ 06 ноября 2010

, чтобы распечатать его побайтно, нужно использовать

printf("%c ", *data++)

или распечатать шестнадцатеричные значения:

printf("%02X", *data++);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...