Буду предупреждать вас прямо сейчас, то, как CS50 обрабатывает C строк и ввод / вывод чрезвычайно вводит в заблуждение, и это приведет к изжоге в дальнейшем. Я понимаю мотивацию (поместите дружественный, высокоуровневый интерфейс на недружественные, низкоуровневые операции), но они плохо его испортили.
Из записи Руководство программиста CS50 для get_int
первый аргумент должен быть типа char *
(string
- это имя определения типа или псевдоним для char *
1 ), поэтому вам нужно написать
n = get_int( prompt );
Выражение %n
недопустимо в C, и именно это задушил компилятор.
Вы можете поместить это в al oop, чтобы повторить операцию, пока n
меньше или равно 0:
do {
n = get_int( prompt );
} while ( n <= 0 );
И это то, что я имею в виду, что CS50 вводит в заблуждение. char *
не является строкой . В C строка представляет собой последовательность символьных значений, включая терминатор с 0 значениями. Например, строка "hello"
представляется как последовательность {'h', 'e', 'l', 'l', 'o', 0}
. Строки хранятся в массивах символьного типа. В большинстве случаев , выражение типа "массив N-элементов T
" будет преобразовано ("затухание") в выражение типа "указатель на T
" и значением выражения будет адрес первого элемента массива. Итак, когда мы имеем дело со строками, мы обычно имеем дело с выражениями типа char *
, но char *
не всегда является указателем на первый символ в строке.