【发布时间】:2019-05-10 08:20:30
【问题描述】:
为什么这里 printf 语句中的数组前需要一个 & 号,而其他时候 & 号只用在 scanf 中?
全新,所以如果你能尽可能简单地解释一下会有所帮助。
int main(void) {
char word[1];
scanf("%s", &word[0]);
printf("%s", word[0]);
return 0;
}
【问题讨论】:
为什么这里 printf 语句中的数组前需要一个 & 号,而其他时候 & 号只用在 scanf 中?
全新,所以如果你能尽可能简单地解释一下会有所帮助。
int main(void) {
char word[1];
scanf("%s", &word[0]);
printf("%s", word[0]);
return 0;
}
【问题讨论】:
你确实需要一个。没有它是不正确的,并导致未定义的行为,这可能会导致任何事情发生(即使程序看起来正常工作)。此外,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]我们有一个例子。这样,如果用户输入的内容太大,您就不会出现未定义的行为,而是会截断该输入。
【讨论】:
word[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() 写入它的参数。
【讨论】: