«Место нарушения прав доступа» при записи в файл - PullRequest
0 голосов
/ 17 января 2020

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

void read(int n, int* v);
int prime(int);
void solve(int n, int x, int* v, FILE*);
void open_file_write(char*, FILE*);

void main()
{
    int n, i, x, k, *v;
    FILE* fp = NULL;
    char s[30];
    n = 7;
    open_file_write(s, fp);
    v = new int[n];
    read(n, v);
    x = v[n / 2];
    solve(n, x, v, fp);
    delete[](v);
    if (fp)
        fclose(fp);
    else exit(1);
}

void solve(int n, int x, int* v, FILE* fp)
{
    int i, k = 0;
    float ma = 0;
    for (i = 0; i < n; i++)
        if (v[i] < x && prime(v[i]))
        {
            printf_s("%d ", v[i]);
            k++;
            ma += v[i];
            fprintf_s(fp, "%d   ", v[i]);
        }
    printf_s("\n%f  ", ma / k);

}


void read(int n, int* v)
{
    int i;
    for (i = 0; i < n; i++)
        scanf_s("%d", &v[i]);
}


int prime(int x)
{
    int i;
    if ((!(x % 2) && x != 2) || x == 1 || x == 0)
        return 0;
    else if (x == 2)
        return 1;
    for (i = 3; i * i < x; i++)
    {
        if (!(x % i))
            return 0;
    }
    return 1;
}


void open_file_write(char* file_name, FILE* fp)
{
    errno_t err;
    printf_s("Enter the name of your destination file: ");
    scanf_s("%s", file_name, 100);

    if ((err = fopen_s(&fp, file_name, "w") != 0))   //opening destination file
    {
        puts("Error opening destination file");
        _getch();
        exit(1);
    }
}

1 Ответ

0 голосов
/ 17 января 2020

«Вы сообщаете scanf_s, что буфер file_name имеет размер 100 символов, но на самом деле его размер составляет всего 30 символов. Scanf_s дополняет буфер нулями, после чего ваша программа демонстрирует неопределенное поведение из-за переполнения буфера». - @ Игорь Тандетник

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