Почему я получаю сообщение об ожидаемом выражении при компиляции этого кода C - PullRequest
0 голосов
/ 09 апреля 2020

Как мне получить этот код для отклонения чисел (в виде чисел с плавающей точкой), которые являются отрицательными? Это часть проблемы, поставленной один для CS50? При попытке компиляции генерируется ошибка в «n = get_int (% n, приглашение»

#include <cs50.h>
#include <stdio.h>

//prompts user to submit amount of change
int get_positive_float(string prompt); 
int main(void)
{
    float change = get_positive_float("Change owed: ");
    printf("%.2f\n", change);
}

//ensures user submits a positive number
int get_positive_float(string prompt)
{
    int n;
    do
    {
        n = get_int(%n, prompt);
    }
    while (n < 0);
    return n;
}

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Эта строка:

    n = get_int(%n, prompt);

Неверно. % является оператором по модулю и нуждается в двух операндах. Может быть, вы хотели, чтобы это была какая-то строка формата? У вас нет определения get_int присутствует, поэтому сложно сказать.

Если не считать редакционную статью, немного странно иметь функцию с именем get_positive_float, которая возвращает int.

0 голосов
/ 09 апреля 2020

Буду предупреждать вас прямо сейчас, то, как 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 * не всегда является указателем на первый символ в строке.
...