为什么在此printf语句中需要连字符?

时间:2019-05-10 08:20:31

标签: c

为什么我在这里的printf语句中的数组之前需要一个&符,但是其他任何时间&符仅在scanf中使用?

是全新的,因此,如果您可以尽可能简单地进行说明,将会有所帮助。


int main(void) {

  char word[1];
  scanf("%s", &word[0]);
  printf("%s", word[0]);
  return 0;
}

3 个答案:

答案 0 :(得分:2)

您确实需要一个。如果没有一个,它是不正确的,并且会导致未定义的行为,这可能会导致任何事情发生(甚至该程序似乎正常工作)。另外,word[1]只能容纳一个空字符串的null终止符,如果超过该数目,它将导致缓冲区溢出,还导致未定义的行为。应该是:

int main(void) {
    char word[10]; // or any value that is big enough for the input that your anticipating
    scanf("%9s", &word[0]);
    printf("%s", &word[0]);
    return 0;
}

当然,您可以将&word[0]替换为word

还要注意,对于%9s调用,我放置了%s而不是scanf,这意味着它将最多获取9个字符,并添加了null终结符适合作为示例的word[10]。这样,如果用户输入的内容太大,您就不会得到不确定的行为,而只会截断该输入。

答案 1 :(得分:0)

http://localhost:3000是第一个字符。 word[0]符号用于获得指向此类字符的 pointer

答案 2 :(得分:0)

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

在C中,字符串(在上面的语句中以%s寻址)定义为数组。您对“单词”的声明:

  

字符词[1​​];

声明一个数组,以便数组可以是一个字符串(我写了 can ,因为它是一个很短的字符串...)。如果仅使用标识符“ word”,则编译器将使用指向数组第一个元素的指针。因此:

scanf("%s", word);
printf("%s", word);

都是正确的。但是,如果您在数组中使用索引,例如“ word [0]”,那么您将不再使用数组本身,而是使用其中的一个元素。该表示法不会生成指针,但是您的上述语句确实需要指针。因此,您可以使用“&”获取指针。

结论:如果您有字符串,请使用其简单名称而不在数组内建立索引。使用&号可以清楚地表明我们传递了一个引用,但是“&word [0]”很丑陋,而且,每个人都应该知道scanf()会将写入其参数。