我的程序运行但我收到一些警告,告诉我格式 %d 不能去那里

My program runs but I get some warnings that tell me the format %d can't go there

我必须制作一个程序,要求我输入不同的值,然后它必须将它们打印在屏幕上。在那之后,它问我,“你想改变向量的哪个值?”我必须输入值的数量而不是值本身。

当我 运行 程序时,我收到几个这样的警告:

“警告:格式‘%d’需要 'int' 类型的参数,但参数 6 的类型为 'int *' [-Wformat=]”

我不知道如何解决这个问题,我尝试使用 %p 但它没有帮助。 有什么想法吗?

#include <stdio.h>
#include <stdlib.h>

#define MAX 5

int main()
{
    int intero = 0;
    int *p_int;

    int vettore[MAX] = {0};
    int *p_vet;
    int num = 0;
    int val = 0;

    char carattere = 0;
    char *p_car;

    p_int = &intero;
    p_car = &carattere;
    p_vet = vettore;

    printf("Enter an integer: ");
    scanf ("%d", &intero);
    fflush (stdin);

    printf ("\nEnter a character: ");
    scanf("%c", &carattere);
    fflush (stdin);

    for (int i=0; i<MAX; i++)
    {
        printf("\nEnter integer n^%d of the vector: ", i);
        scanf("%d", &vettore[i]);
        fflush (stdin);
    }

    printf("\n\n\n");

    printf("Type\t\tDirect Value\t\tValue by Pointer\tDirect Position\tPosition by Pointer\n");
    printf("__________________________________________________________________________________________________________________\n\n");
    printf("Integer:\t\t%d\t\t\t%d\t\t\t\t%d\t\t\t\t%d\n\n", intero, *p_int, &intero, p_int);
    printf("Character:\t%c\t\t\t%c\t\t\t\t%d\t\t\t\t%d\n\n", carattere, *p_car, &carattere, p_car);

    for (int i=0; i<MAX; i++)
    {
        printf("Integer n^%d:\t%d\t\t\t%d\t\t\t\t%d\t\t\t\t%d\n\n", i, vettore[i], *p_vet, &vettore[i], p_vet);
        p_vet++;
    }

    p_vet = vettore;

    printf("\nEnter which value of the vector you want to change: ");
    scanf("%d", &num);
    fflush(stdin);

    printf("\nEnter now the value you want: ");
    scanf("%d", &val);
    fflush(stdin);

    *(p_vet + num) = val;
    printf("\n\n");

    for (int i=0; i<MAX; i++)
    {
        printf("Integer n^%d:\t%d\t\t\t%d\t\t\t\t%d\t\t\t\t%d\n\n", i, vettore[i], *p_vet, &vettore[i], p_vet);
        p_vet++;
    }

    return 0;
}

在包含“scanf”的行中删除“&”。这会导致代码传递对值的引用而不是实际值。 有关引用

的解释,请参阅 Meaning of "referencing" and "dereferencing" in C

通过使用 %p 格式说明符,您告诉 printf 您要打印的值实际上是一个内存地址,而不是指针指向的值。每当你使用一个指针而不用 * 操作数取消引用它时,你只是打印它指向的内存偏移量,它没有格式化为整数。在我看来,有时你只是这样做,就像这里:printf("Integer:\t\t%d\t\t\t%d\t\t\t\t%d\t\t\t\t%d\n\n", intero, *p_int, &intero, p_int);

因为 p_int 是一个指针,而您使用 %d 作为格式说明符,它会抛出那种错误。用 *p_int 取消引用它是正确的做法,我认为,除非你的意图是实际打印内存偏移量,在那种情况下你应该使用 %p 并将指针转换为 (void*) .

确切的编译器输出是:

warning: format '%d' expects argument of type 'int', but argument 4 has type 'int *' [-Wformat=]
42 |     printf("Integer:\t\t%d\t\t\t%d\t\t\t\t%d\t\t\t\t%d\n\n", intero, *p_int, &intero, p_int);
   |                                           ~^                                 ~~~~~~~
   |                                            |                                 |
   |                                            int                               int *

请注意那些“ASCII 箭头”首先指出格式说明符的位置,然后指出错误类型的参数的位置。用简单的英语写着 BUG HERE 和 BUG HERE。嗯,错误可能在哪里?可能在那些地方!

在这种情况下,结果是 %d 期望 int&interoint*。就像编译器告诉我们的那样。

I tried using %p but it doesn't help

它有很大帮助,因为它可以消除错误。我在你的代码上做了这个并摆脱了所有警告。我所做的只是在编译器向我指出的确切位置用 p 替换 d。我根本不需要动脑筋来查找和修复错误,我只是盲目地听从了编译器的建议,并在向我指出的格式字符串中修复了确切的位置。