【问题标题】:warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char (*)’警告:格式“%s”需要类型“char *”,但参数 2 的类型为“char (*)”
【发布时间】:2013-05-10 08:37:39
【问题描述】:

我正在尝试运行一个简单的 C 程序,但出现此错误:

警告:格式“%s”需要类型“char *”,但参数 2 的类型为“char (*)[20]”

运行 Mac OSX Mountain Lion,使用 gcc 4.2.1 在终端中编译

#include <stdio.h>

int main() {
    char me[20];

    printf("What is your name?");
    scanf("%s", &me);
    printf("Darn glad to meet you, %s!\n", me);

    return (0);
}

【问题讨论】:

    标签: arrays c pointers scanf


    【解决方案1】:
    scanf("%s",&me);
    

    应该是

    scanf("%s",me);
    

    说明:

    "%s" 表示scanf 需要一个指向 char 数组第一个元素的指针。 me 是一个对象数组,可以作为指针求值。所以这就是为什么你可以直接使用me而不添加&amp;。将&amp; 添加到me 将被评估为‘char (*)[20]’ 并且您的scanf 正在等待char *

    代码评论家:

    如果用户输入长度> 20的字符串,使用"%s"可能会导致缓冲区溢出。因此将其更改为"%19s"

    scanf("%19s",me);
    

    【讨论】:

    • 如果你也解释一下为什么就好了
    • 或者..., &amp;me[0]),如果你真的想使用&amp;操作符的话。
    • @Mike 因为...等等,编译器警告清楚地告诉你原因。
    • @H2CO3 - 啊,但如果杰克很清楚,他就不会问这个问题。 ;)
    • 我本可以进一步改进这一点,但犹豫不决,因为我不确定你是否会批准:基本上,当需要指针表达式时,数组表达式会转换为指针表达式,例如.传递给函数。
    【解决方案2】:

    除非它是sizeof_Alignof 或一元&amp; 运算符的操作数,或者是用于在声明中初始化数组的字符串文字,否则为“N 元素数组”类型的表达式的 T" 将被转换 ("decay") 为 "pointer to T" 类型的表达式,并将计算为数组中第一个元素的地址。

    数组me被声明为char的20元素数组;通常,当表达式 me 出现在您的代码中时,它将被视为“指向char 的指针”类型的表达式。如果你写了

    scanf("%s", me);
    

    那么你就不会得到错误;表达式me 将被转换为正确类型的表达式。

    但是,通过使用&amp; 运算符,您已经绕过了该规则;您传递的不是指向char 的指针,而是指向char (char (*)[20]) 的数组 的指针,这不是scanf%s 转换说明符的期望,因此诊断。

    【讨论】:

    • s/绕过/采取了不同的途径/,或者类似的东西,也许。因为规则,结果不同。无论如何都要为报价 +1。
    • 注意:_Alignof 是 N1570 中的一个错误,已在标准中删除。这是有道理的,因为_Alignof 的操作数是一个类型_Alignof ( type-name ),而不是任意表达式。
    • @DanielFischer 你能看看这个吗。我指出的“异常”很清楚。它是关于最后一个标记,它在最后一个分隔符和 NULL 字符之间,而不是 2字符串标记所需的分隔符--stackoverflow.com/questions/16571060/…
    • @DanielFischer 很遗憾我不得不用这种方式给你发消息,我检查了你的活动,它说你最后一次被看到是在一分钟前,这个问题是你最新的 C 相关活动。
    【解决方案3】:

    解决此问题的另一种方法是:

    scanf("%s",&me[0]);
    

    您实际上必须给出数组的起点(在大多数语言中是 0)。

    【讨论】:

      猜你喜欢
      • 2018-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多