используя функцию findMov ie во второй раз, Visual Studio выдает исключение - PullRequest
0 голосов
/ 14 апреля 2020

visual studio генерирует исключение для второго экземпляра find mov ie в случае c, оно говорит, что оно еще не было инициализировано, хотя в локальном windows оно показывает структуру с информацией внутри? Run-Time Сбой проверки № 3 - переменная tempMov ie используется без инициализации. это происходит только во второй раз, когда я пытаюсь использовать struct tempMov ie

#include <stdio.h>
#include <conio.h>
#include <string.h>
#define CONST 100
typedef struct movies {
    char title[30];
    char UPC[12];
    int qnty;
    double price;
}movies;
void sortMovies(struct movies main[], int nOfMovies);
void changeMovie(struct movies main);
int findMovie(struct movies main, int nOfMovies, struct movies tempMovie);
struct movies newMovie();


int main()
{
    int nOfMovies = 0, findR, stop = 0, nOfMoviesArr[CONST];
    char decider;
    while (stop != 1)
    {
        movies main[CONST];
        movies tempMovie;
        printf("(A)dd a new movie\n(C)hange a Movie's Information \n(D)elete a Movie \n(L)ist All Movies\n(Q)uit\n\n");
        scanf(" %c", &decider);

        switch (decider)
        {
        case 'a':
        case 'A':
            tempMovie = newMovie();
            findR = findMovie(main[nOfMovies], nOfMovies, tempMovie);
            if (findR == -1)
            {
                nOfMovies += findR;
                break;
            }
            else
            main[nOfMovies] = tempMovie;
            nOfMovies++;
            break;
        case 'c':
        case 'C':
            findR = findMovie(main[nOfMovies], nOfMovies, tempMovie);
            changeMovie(main[findR]);
            break;
        case 'd':
        case 'D':

            break;
        case 'l':
        case 'L':
            sortMovies(main, nOfMovies);
            break;
        case 'q':
        case 'Q':
            return 0;
            break;
        default:
            printf("An invalid option was selected!");
        }
    }


}

struct movies newMovie() {
    movies new;

    printf("enter movie upc:");
    scanf("%s", &new.UPC);
    printf("enter movie title:");
    scanf("%s", &new.title);
    printf("enter movie qauntity:");
    scanf("%d", &new.qnty);
    if (new.qnty <= 0)
    {
        printf("quanitity must be greater than 0");
        printf("enter movie qauntity:");
        scanf("%d", &new.qnty);
    }

    printf("enter movie price:");
    scanf("%lf", &new.price);
    if (new.price <= 0)
    {
        printf("price must be greater than 0");
        printf("enter movie price:");
        scanf("%lf", &new.price);
    }
    return new;
}


int findMovie(struct movies main, int nOfMovies, struct movies tempMovie)
{

    int count;
    for (count = 0; count < nOfMovies; count++)
    {
        if (tempMovie.UPC != main.UPC)
        {
            return count;
        }
        else
        {
            printf("error");
            return -1;
        }
    }

}
void changeMovie(struct movies main)
{
    char decider;

    printf("would you like to change the value? y or no input");
    switch (decider)
    {
    case 'y':
    case 'Y':
        printf("enter movie title:");
        scanf("%c", main.title);
        printf("enter movie qauntity:");
        scanf("%d", main.qnty);
        if (main.qnty <= 0)
        {
            printf("quanitity must be greater than 0");
            printf("enter movie qauntity:");
            scanf("%d", main.qnty);
        }

        printf("enter movie price:");
        scanf("%lf", main.price);
        if (main.price <= 0)
        {
            printf("price must be greater than 0");
            printf("enter movie price:");
            scanf("%lf", main.price);
        }
        break;
    default:
        printf("An invalid option was selected!");



    }

}
void sortMovies(struct movies main[], int nOfMovies)
{
    int i, sflag, count = 0;
    char* temp;

    do
    {
        sflag = 0;
        for (i = 1; i < nOfMovies; i++)
        {
            if (main[i - 1].title > main[i].title)
            {
                temp = main[i - 1].title;
                strcpy(main[i - 1].title, main[i].title);
                strcpy(main[i].title, temp);
                sflag = 1;
            }
        }
        count++;
    } while (sflag);

    for (i = 0; i < nOfMovies; i++)
    {
        printf("%s\t%s\t%d\t%.2lf\n", main[i].title, main[i].UPC, main[i].qnty, main[i].price);
    }


}```




1 Ответ

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

Ошибка может быть вызвана любой или многими следующими причинами:

  1. В changeMov ie () переменная решения не сканируется.

  2. В scanf () используйте пробелы, пропущенные до "%c" и "%s" (используйте " %c" и " %s")

  3. В changeMov ie () , синтаксическая ошибка при сканировании (используйте &main.qnty вместо main.qnty)

  4. Функция changeMov ie () изменяет формальные параметры и не изменяет фактические параметры

Также есть несколько логических ошибок. Например, в строке if (new.price <= 0) следует использовать while вместо if

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