Почему моя функция float не работает так, как задумано? - PullRequest
0 голосов
/ 24 марта 2019

Моя функция priceDifference внутри оператора if startShare в конце не возвращает вычисленные числа с плавающей точкой и отображает их в консоли.Мои другие функции работают должным образом, это просто та функция, которая собирает бананы, и я понятия не имею, почему.

Например, когда я передаю числа 2105.11 и 1999.55, он возвращает 1999.55 ???

#include <stdio.h>

void shareStart();
char askMe();
char askMe2();
char askMe3();
char askAgain();
int getShares();
int getMoney();
float getStartingInvestment();
float getSoldInvestment();
float getPrice();
float shareDivide(float, int);
float shareMultiply(float, int);
float priceDifference(float, float);

int main()
{
    shareStart();
    return 0;
}

void shareStart()
{
    do {
        if(askMe() == 'y') {
         printf("You could buy: %f shares.\n", shareDivide(getPrice(), getMoney()));
        } else if(askMe2() == 'y') {
          printf("Shares cost: %f\n", shareMultiply(getPrice(), getShares()));
        } else if(askMe3() == 'y') {
            printf("Profit/Loss is: %f\n", priceDifference(getStartingInvestment(), getSoldInvestment()));
        }
    } while(askAgain() == 'y');
}

char askMe()
{
    char ask;
    printf("See how many shares to buy? 'y/n'\n");
    scanf("%s", &ask);
    return ask;
}

char askMe2()
{
    char ask;
    printf("See total cost of shares? 'y/n'\n");
    scanf("%s", &ask);
    return ask;
}

char askMe3()
{
    char ask;
    printf("See profit/loss difference between trades? 'y/n'\n");
    scanf("%s", &ask);
    return ask;
}

char askAgain()
{
    char ask;
    printf("Would you like to run the program again? 'y/n'\n");
    scanf("%s", &ask);
    return ask;
}

int getShares()
{
    int ask;
    printf("How many shares are you using?\n");
    scanf("%d", &ask);
    return ask;
}

int getMoney()
{
    int money;
    printf("How much money are you using?\n");
    scanf("%d", &money);
    return money;
}

float getStartingInvestment() 
{
    float money;
    printf("How much money did your shares cost?\n");
    scanf("%f", &money);
    return money;
}

float getSoldInvestment()
{
    float money;
    printf("What did you sold your shares for?\n");
    scanf("%f", &money);
    return money;
}

float getPrice()
{
    float price;
    printf("Whats the price of a share?\n");
    scanf("%f", &price);
    return price;
}

float shareDivide(float price, int money) 
{
    return money / price;
}

float shareMultiply(float price, int shares) 
{
    return shares * price;
}

float priceDifference(float start, float sold)
{
    return sold - start;
}

Ответы [ 2 ]

0 голосов
/ 24 марта 2019

Спецификация %s для fscanf предписывает ему прочитать последовательность символов, не являющихся пробелами, и сохранить их вместе с завершающим нулевым символом в пространстве для символов, на которые указывает аргумент.

Когда ask определено с char ask, передача &ask передает указатель на пробел для одного символа. Этого недостаточно, чтобы вместить как символ, отсканированный с ввода, так и завершающий нулевой символ. В результате ваша программа номинально пытается записать нулевой символ в память, не выделенную для него. Это может сломать вашу программу любым количеством способов.

Изменение строки fscanf на %c говорит ей прочитать один символ и сохранить его в месте, указанном аргументом, без завершающего нулевого символа. Это устраняет проблему, поскольку данные записываются только в правильно распределенное пространство.

0 голосов
/ 24 марта 2019

Я не знаю точно, как это работает, но ответ, указанный в комментариях, заключается в изменении спецификатора формата функции scanf на "% c" во всех функциях ask.

Выполнение со спецификатором "% s" ~~ Выполнение со спецификатором "% c"


Я запустил программу со спецификатором "% s" в командной строке моего ноутбука, и она работает нормально. Что-то говорит мне, что онлайн-компилятор заставляет его работать неожиданно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...