【问题标题】:warning: format '%c' expects type 'int', but argument 2 has type 'char *'警告:格式“%c”需要类型“int”,但参数 2 的类型为“char *”
【发布时间】:2012-01-24 12:15:28
【问题描述】:

我正在尝试将存储在十六进制数组中的所有字符逐个打印到屏幕上,但在第 16 行出现了这个奇怪的错误。据我所知,%c 应该期待一个 char,而不是一个 int . 为什么我会收到此错误? 下面是我的代码,谢谢。

    #include <stdio.h>
    #include <stdlib.h>
    #include <limits.h>
    #include <ctype.h>
    #include <string.h>

    int main() 
    {
        char hex[8] = "cf0a441f";
        int hexCounter;
        char *currentHex;

        for(hexCounter=0; hexCounter<strlen(hex); hexCounter++)
        {
            currentHex = &hex[hexCounter];
            printf("%c",currentHex);
        }   
         return 0;
    }

【问题讨论】:

  • hex 必须声明为 char hex[9],而不是 [8]。您忘记了空终止符。

标签: c char


【解决方案1】:

你是说

printf("%c", *currentHex);

在我看来,您可以删除currentHex 的整个想法,因为它只会增加复杂性而没有任何价值。只需这样做:

printf("%c", hex[hexCounter]);

重要的是你应该传递字符本身的,而不是你正在做的地址。

【讨论】:

  • 因为您将currentHex 传递给printf,而currentHex 是指向char 的指针。顺便说一句,这不是错误,而是警告。
  • @user1166935:警告非常清楚 - %c 转换说明符期望其对应的参数为 int 类型,但您传递的参数类型为 char *
  • 只是警告并不意味着它不严重。这只是意味着代码不会违反编译器需要强制执行的编译时约束。在 OP 的情况下,传递错误的类型会调用 UB,这是非常糟糕的。
【解决方案2】:

你有hex[hexCounter] 作为char 所以当你设置

currentHex = &hex[hexCounter];

您将currentHex 设置为char 的地址,即char *。因此,在您的printf 中,您需要

printf("%c",*currentHex);

无论如何,你正在做的事情是不必要的,因为你可以这样做

printf("%c",hex[hexCounter]);

【讨论】:

    【解决方案3】:

    currentHex 的类型应该是 char,而不是 char *

     char currentHex;
    
     [..]
    
     currentHex = hex[hexCounter];
     printf("%c",currentHex);
    

    如果你真的希望它是一个指针,取消引用它以打印:

    printf("%c",*currentHex);
    

    【讨论】:

      【解决方案4】:

      这是修改后的代码,对我来说运行良好 -

      #include <stdio.h>
      #include <stdlib.h>
      
      #include <limits.h>
      #include <ctype.h>
      #include <string.h>
      
      int main() 
      {
          char hex[9] = "cf0a441f";
          unsigned int hexCounter; 
          char *currentHex;
          for(hexCounter=0; hexCounter<strlen(hex); hexCounter++)
          {
              currentHex = &hex[hexCounter];
              printf("%c",*currentHex);
          }   
           return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-10
        • 2014-04-23
        • 1970-01-01
        • 2011-06-12
        • 1970-01-01
        • 2019-04-03
        相关资源
        最近更新 更多