【问题标题】:C - format specifies type 'int' but the argument has type 'char *' [-Wformat]C - 格式指定类型“int”,但参数的类型为“char *”[-Wformat]
【发布时间】:2025-12-21 02:45:12
【问题描述】:

我已经定义了一个vector 的指针与工作日。稍后,我想对日期进行排序lexicographically

我使用printf("%s", *(wochentag + i)); 打印所有工作日。我想要每个工作日的每个第一个字母的输出。稍后,我还想访问每个单词的第二、第三、...字母。

通过使用

printf("%c", *(wochentag + i));` 

我收到以下警告:

format specifies type 'int' but the argument has type 'char *' [-Wformat].

这是我的代码:

int main()
{
   static char *wochentag[] = {"Montag", "Dienstag", "Mittwoch", "Donnerstag", 
                        "Freitag", "Samstag", "Sonntag"};
    printf("%lu\n", sizeof(wochentag));
    printf("%lu\n", sizeof(char));
    for (int i = 0; i < 7; i++)
    {
        printf("%s\n", *(wochentag + i));
    }
    for (int i = 0; i < 7; i++)
    {
        printf("%c\n", *(wochentag + i));
    }
}

我做错了什么?

【问题讨论】:

  • 格式字符 '%c' 表示一个字符(或字节),可以表示为 int,但实际上您是在取消引用 printf("%s\n", *( wochentag + i));
  • 请不要使用*(arr + i) 访问数组的元素。请改用arr[i]

标签: c string pointers char printf


【解决方案1】:

错误信息不言自明,存在数据类型不匹配。

*(wochentag + i)的另一种语法是(wochentag[i]),它的类型是char *

现在,将其传递给 %c 是错误的,因为此转换规范需要 char 类型。

如果您只对第一个字符感兴趣,则必须对该数组进行索引,例如 (wochentag[i][0])。类似的东西

 printf("%c\n", wochentag[i][0]);

应该可以。

【讨论】:

  • @M.M:如果类型包括存储类和链接,那会很有趣,并且您需要强制转换来将自动值分配给静态左值或将内部值分配给外部事物。 ?
  • 非常感谢您的回答。现在它起作用了。很有帮助。
【解决方案2】:

printf("%c\n", *(wochentag + i)) 中,*(wochentag + i) 是一个字符串,更准确地说是一个指向字符串文字(以空结尾的只读字节数组)的解引用指针,正如您在代码中看到的那样,您需要"%s" 格式说明符.

要打印每个字符串中的第一个 char,您需要额外的取消引用:

printf("%c\n", **(wochentag + i));

或者为了更便于阅读的符号

printf("%c\n", wochentag[i][0]);

指示"%c" 需要int 的警告是因为它确实需要特定字符的int 代码。

一个实际的例子:

int x = 65;  //ASCII code for the letter 'A'
printf("%c\n", x);

这将输出A

【讨论】:

    【解决方案3】:

    您的数组数据类型 char*[] 是一种双指针类型,因此当您使用 %s 打印时,它知道它具有某个字符数组的地址,但是当您在 printf 中仅使用 '%c' 打印时,您有给出实际字符而不是地址....所以你必须取消引用它两次

    如下图

    printf("%c", **(wochentag + i));
    

    希望这能解决你的问题....和平

    【讨论】: