Зачем мне амперсанд для этого оператора printf? - PullRequest
0 голосов
/ 10 мая 2019

Зачем мне нужен амперсанд перед массивом в выражении printf здесь, но в любое другое время амперсанд используется только в scanf?

Абсолютно новый, так что, если бы вы могли объяснить как можно проще, это помогло бы.


int main(void) {

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

Ответы [ 2 ]

2 голосов
/ 10 мая 2019

Вам нужен один.Без него он некорректен и ведет к неопределенному поведению, которое может привести к чему-либо (даже к тому, что программа работает правильно).Кроме того, 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[0] на word.

Также обратите внимание, что я поставил %9s вместо %s для scanf вызов, что означает, что он получит не более 9 символов, что с добавленным нулевым терминатором вписывается в word[10], который мы имеем в качестве примера.Таким образом, вы не получите неопределенное поведение, если пользователь введет что-то слишком большое, а вместо этого просто урежет этот ввод.

0 голосов
/ 10 мая 2019

word[0] - первый символ.знак & используется для получения указателя на такой символ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...