Проблема не в написании, а в чтении - преобразование scanf
%s
пропускает любой начальный пробел, затем считывает и преобразует до (но не включая) следующего пробела.
Возможно, вы захотите использовать что-то вроде fgets
или %[^\n]
с scanf
.
Редактировать: я должен также упомянуть, что когда / если вы используете преобразование набора сканирования (%[^\n]
), вы должны указать длину буфера, в который вы читаете.
Поскольку &buffer
в scanf("%s", &buffer);
является ошибкой, технически это дает неопределенное поведение, но в действительности я незнать о любой реализации, где это имеет значение.
В этом случае buffer
был определен как массив, а не указатель.Имя массива «распадается» на указатель при многих обстоятельствах, но не при использовании в качестве операнда оператора адреса (унарный &
).Таким образом, buffer
и &buffer
дают точно такой же результат, адрес начала массива.
Однако разница все же есть.Когда вы используете просто buffer
, вы получаете значение типа pointer to char
(учитывая, что буфер является массивом char).Когда вы используете &buffer
, вы получаете указатель типа pointer to array of MAXLEN char
.
Теперь, когда вы передаете значение в scanf (переменная функция), вы получаете неопределенное поведение, когда / если типпередаваемое вами значение не соответствует типу, ожидаемому при преобразовании, которое вы указали.В действительности, с каждым C-компилятором, о котором я когда-либо слышал, он будет работать нормально, потому что один и тот же адрес будет передан в любом случае.В теории (но только в теории, AFAIK) компилятор может использовать своего рода "толстый указатель", который включает информацию о типе вместе с адресом, поэтому scanf
сможет обнаружить несоответствие типов.В действительности, я не знаю ни одного компилятора, который бы делал что-то очень похожее, поэтому вы не увидите никакой разницы между использованием buffer
и &buffer
в этом случае.
В других обстоятельствах,однако, разница может быть обнаружена.Сложение и вычитание указателей основано на типе, поэтому (например) array+1
и &array + 1
будут давать разные результаты:
#include <stdio.h>
int main() {
char array[10];
printf("%p %p %p\n", array, array+1, &array+1);
return 0;
}
Это напечатает три числа.Первое число будет произвольным числом, обычно в шестнадцатеричном формате.Второй будет на единицу больше первого, а второй будет на 10 больше первого (потому что я определил его как массив из 10 символов ...)