Здесь происходит две вещи:
Во-первых, указатель вашего символа должен указывать куда-то.С помощью строки
char *string1 = "";
вы создаете указатель на строковый литерал, в который вы не можете писать.(Очевидно, вы можете, учитывая ваш вывод, но вам просто повезло в системе, которая позволяет это.) Вместо этого создайте символьный буфер:
char string1[200] = "";
и в идеале применяйте постоянный предел буфера при чтении строки.
Во-вторых, вам не нужны все эти &
с.&
- это не магический маркер, который вы должны добавить ко всем своим аргументам.
&
берет адрес переменной и передает его как указатель.Это необходимо, когда вызываемая функция должна изменить переменную с помощью указателя.Печать не должна ничего менять, поэтому, если вы не хотите печатать адрес переменной с %p
, вы не должны передавать адреса.(В особом случае вашей программы вы можете просто удалить все амперсанды с помощью поиска и замены.)
При сканировании вам необходимо изменить переменные, если вы преобразуете ввод в числа или сканируете символ.Исключение составляют случаи, когда вы сканируете строки с помощью %s
или %[...]
: здесь вы передаете буфер символов (как указатель на его первые элементы), а затем функция заполняет этот буфер.
Проблема с scanf
и printf
- это то, что аргументы после строки формата являются переменными, что означает, что они будут принимать любые аргументы без проверки типа.Хорошо, что большинство компиляторов могут определить, соответствует ли строка формата аргументам, и будут выдавать предупреждения, если вы их включите.Сделай себе одолжение и сделай это.
(Предупреждения также сообщат вам, что у вас есть несоответствия типов в функциях, для которых известен тип аргумента, например, is_bigger_than_10
.)