Во-первых, вашего работающего кода недостаточно для того, чтобы сказать, что он правильный.
Во втором фрагменте кода purchase_location
- это не строка или массив символов, это просто один символ. Причина, по которой вы не получаете никакого предупреждения, заключается в том, что scanf
просто нужен адрес. Когда вы ставите &
перед именем переменной, он просто дает адрес переменной (который scanf
может использовать для хранения значения пользовательского ввода в). Теперь, когда дело доходит до массивов, имя массива без квадратных скобок или индекса просто дает адрес первого элемента массива, чтобы было понятно, как это выглядит ниже:
Предположим, у нас есть char a[10]
, a даст адрес первого элемента массива, a[0]
даст значение первого элемента массива, и если вы будете следовать, вы будете знать, что &a[0]
снова даст адрес Первый элемент массива. Если у нас есть char b
, &b
- это адрес переменной char. Теперь для scanf
оба &b
и a
являются просто адресами двух переменных типа char, но на самом деле они совершенно разные,
Если вы скажете scanf
, что ожидаете строку, упомянув %s
, он будет принимать введенные вами символы и помещать их по указанному адресу, вот и все. Я полагаю, что в вашем случае вам повезло, что у вас есть этот пробел.
Если вы скажете printf
, что переменная является строковой переменной, и дадите ей адрес, она просто примет все символы, доступные в этой части память.
Два из них вместе могут быть причиной того, что вы не получаете никаких предупреждений и не обнаруживаете ошибки в выводе. В другом случае это место может быть недоступно или, что еще хуже, вы можете перезаписать некоторые другие данные.