警告:格式“%s”需要类型为 'char *' 的参数,但参数 2 的类型为 'int'

warning: format '%s' expects argument of type 'char *', but argument 2 has type 'int'

我有这个程序声称可以将十进制数转换为十六进制数。问题是程序抛出上述警告,我不知道如何纠正它。 return(变量标识符)应该是一个 %s 因为你想显示的是一个字符串。

#include <stdio.h>

int main() {
    int n = 0;
    char hex = '[=12=]';
    const char * HEX_DIG = "0123456789ABCDEF";
    printf ("Enter a positive integer: ");
    scanf ("%d",&n);
    do{
        hex = HEX_DIG [n % 16] + hex;
        n = (int) n/16;
    }while ( n != 0 );
    printf ("\nHexadecimal= %s", hex);
    return 0;
}

%s 格式标记需要一个字符串,在 C 语言中,它是一个 指向 一个 char 的指针(或 char 的数组=13=]s)。您已经为它提供了一个 char,当它传递给带有可变参数的函数(在本例中为 printf)时,它会被提升为一个 int。这就是编译器所抱怨的。

此外,即使您的代码是有效的 C 代码,您也会向后打印整数。

要打印 char,您需要使用 %c。将其合并到现有代码中的最佳方法是将 printf 移动到循环内:

for (int k=0; k<sizeof(int)*2; k++) {
    hex = HEX_DIG[(n >> (sizeof(int)*8-4)) & 0xf]; // Move the high four bits all the way to the right and then mask them off.
    n <<= 4;  // Shift the next four bits into place.
    if ( hex != '0' ) { // No need to print leading 0's.
        printf("%c", hex);
    }
}
printf("\n");

为了解释 sizeof 计算,我们假设 int 的宽度为 four-bytes。然后 sizeof(int)*2 将是八个,它占八组四位。 sizeof(int)*8-4 将是 28,因此我们将移出所有 32 位,除了四个最高位。

请注意,此代码会忽略 n 为零的情况。在这种情况下,循环不会打印任何内容。

稍微备份一下,除非您将其作为练习(也许是作业问题),否则我建议您不要重新发明轮子,因为 printf 已经支持以十六进制格式打印整数:

printf("%x\n", n);