【问题标题】:Why do I need an ampersand for this printf statement?为什么这个 printf 语句需要一个 & 符号?
【发布时间】:2019-05-10 08:20:30
【问题描述】:

为什么这里 printf 语句中的数组前需要一个 & 号,而其他时候 & 号只用在 scanf 中?

全新,所以如果你能尽可能简单地解释一下会有所帮助。


int main(void) {

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

【问题讨论】:

标签: c string printf


【解决方案1】:

你确实需要一个。没有它是不正确的,并导致未定义的行为,这可能会导致任何事情发生(即使程序看起来正常工作)。此外,word[1] 只能保存空字符串的空终止符,仅此而已,它会导致缓冲区溢出,也会导致未定义的行为。应该是:

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替换&word[0]

还请注意,我在 scanf 调用中放置了 %9s 而不仅仅是 %s,这意味着它最多会得到 9 字符,加上添加的空终止符适合 word[10]我们有一个例子。这样,如果用户输入的内容太大,您就不会出现未定义的行为,而是会截断该输入。

【讨论】:

    【解决方案2】:

    word[0] 是第一个字符。 & 符号用于获取指向此类字符的指针

    【讨论】:

    • 为什么 scanf 需要一个指针呢?为什么括号里的数字不够?
    【解决方案3】:
    scanf("%s", &word[0]);
    printf("%s", word[0]);
    

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

    字符字[1];

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

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

    都是正确的。但是如果你使用数组的索引,比如“word[0]”,那么你就不再使用数组本身,而是它的一个元素。此表示法不会生成指针,但您上面的语句确实 需要 一个指针。所以你可以使用“&”来获取指针。

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

    【讨论】:

      猜你喜欢
      • 2020-10-12
      • 2013-03-20
      • 2012-09-10
      • 1970-01-01
      • 2016-02-29
      • 2017-07-17
      • 1970-01-01
      • 2011-08-05
      • 1970-01-01
      相关资源
      最近更新 更多