为什么我在这里的printf语句中的数组之前需要一个&符,但是其他任何时间&符仅在scanf中使用?
是全新的,因此,如果您可以尽可能简单地进行说明,将会有所帮助。
int main(void) {
char word[1];
scanf("%s", &word[0]);
printf("%s", word[0]);
return 0;
}
答案 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()会将写入其参数。