我的程序运行但我收到一些警告,告诉我格式 %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
但 &intero
是 int*
。就像编译器告诉我们的那样。
I tried using %p but it doesn't help
它有很大帮助,因为它可以消除错误。我在你的代码上做了这个并摆脱了所有警告。我所做的只是在编译器向我指出的确切位置用 p
替换 d
。我根本不需要动脑筋来查找和修复错误,我只是盲目地听从了编译器的建议,并在向我指出的格式字符串中修复了确切的位置。
我必须制作一个程序,要求我输入不同的值,然后它必须将它们打印在屏幕上。在那之后,它问我,“你想改变向量的哪个值?”我必须输入值的数量而不是值本身。
当我 运行 程序时,我收到几个这样的警告:
“警告:格式‘%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
但 &intero
是 int*
。就像编译器告诉我们的那样。
I tried using %p but it doesn't help
它有很大帮助,因为它可以消除错误。我在你的代码上做了这个并摆脱了所有警告。我所做的只是在编译器向我指出的确切位置用 p
替换 d
。我根本不需要动脑筋来查找和修复错误,我只是盲目地听从了编译器的建议,并在向我指出的格式字符串中修复了确切的位置。