Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 25.10.2016
Сообщений: 18
1

Ошибка с strcpy

14.11.2016, 20:09. Показов 741. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В данном коде в функции findNearEquals вылетает ошибка доступа к памяти, помогите найти её

Вот код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#define _CRT_SECURE_NO_WARNINGS
#define _CRT_NONSTDC_NO_WARNINGS
 
#include <stdio.h>
#include <conio.h>
#include <locale>
#include <string.h>
 
 
int findMin(FILE *fileInput, FILE *fileOutput) {
    int min = INT32_MAX;
    int m[20];
    char buffer[100], element[5];
 
    fseek(fileInput, 0, SEEK_SET);
    fgets(buffer, 100, fileInput);
    strcpy(element,strtok(buffer, " "));
 
    for (int i = 1; i < 20; i++) {
        m[i] = atoi(element);
        strcpy(element, strtok(NULL, " "));
        if (m[i] < min && m[i] % 2 == 0) min = m[i];
    }
    fprintf(fileOutput, "min = %d", min);
 
    return ftell(fileOutput);
}
int generateM(int m[], FILE *fileInput) {
    srand(time(NULL));
 
    for (int i = 0; i < 20; i++) {
        m[i] = rand() % 32;
        fprintf(fileInput, "%d ", m[i]);
    }
    return ftell(fileInput);
}
void findNearEquals(FILE *fileInput, FILE *fileOutput,
    int posInInput, int posInOutput) {
 
    char buffer[100], element[100];
    int count = 0;
 
    int** mm;
    mm = new int*[10];
    for (int i = 0; i < 10; i++)
        mm[i] = new int[10];
 
    fseek(fileInput, posInInput+2, SEEK_SET);
    fseek(fileOutput, posInOutput, SEEK_SET);
 
    fgets(buffer, 100, fileInput);
    strcpy(element, strtok(buffer, " "));
 
    for (int i = 0; i < 9; i++) {
        for (int j = 0; j < 10; j++) {
            mm[i][j] = atoi(element);
            strcpy(element, strtok(NULL, " "));
        }
        fgets(buffer, 100, fileInput);
    }
    
    for (int i = 0; i < 9; i++) {
        for (int j = 0; j < 10; j++) {
            if (mm[i][j] == mm[i][j + 1]) count++;
        }
    }
    
    fprintf(fileOutput, "\ncount = %d", count);
 
    for (int i = 0; i < 10; i++)
        delete[] mm[i];
    delete[] mm;
}
void generateMM(int **m, FILE *fileInput, int posInInput) {
    srand(time(NULL));
 
    fseek(fileInput, posInInput, SEEK_SET);
    fprintf(fileInput, "\n\n");
 
    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 10; j++) {
            m[i][j] = rand() % 32;
            fprintf(fileInput, "%d ", m[i][j]);
        }
        fprintf(fileInput, "\n");
    }
}
int main() {
    setlocale(LC_ALL, "Russian");
    
    FILE *fileInput = NULL;
    FILE *fileOutput = NULL;
    char fileInputName[20], fileOutputName[20];
    int m[20];
    int* p = m;
 
    int** mm;
    mm = new int*[10];
    for (int i = 0; i < 10; i++)
        mm[i] = new int[10];
 
    while (fileInput == NULL) {
        printf("Введите имя файла с исходными данными: ");
        scanf("%s", fileInputName);
 
        fileInput = fopen(fileInputName, "r+");
        if (fileInput == NULL)printf("\nФайл не найден");
    }
    while (fileOutput == NULL) {
        printf("Введите имя файла с результатами: ");
        scanf("%s", fileOutputName);
 
        fileOutput = fopen(fileOutputName, "r+");
        if (fileOutput == NULL)printf("\nФайл не найден");
    }
    
    fclose(fileInput); fclose(fileOutput);
    fclose(fopen(fileInputName, "w")); fclose(fopen(fileOutputName, "w"));
    fileInput = fopen(fileInputName, "r+");
    fileOutput = fopen(fileOutputName, "r+");
 
    int posInInput = generateM(p, fileInput);
    int posInOutput = findMin(fileInput, fileOutput);
 
    generateMM(mm, fileInput, posInInput);
    findNearEquals(fileInput, fileOutput, posInInput, posInOutput);
 
    for (int i = 0; i < 10; i++)
        delete[] mm[i];
    delete[] mm;
 
    fclose(fileInput);
    fclose(fileOutput);
 
    getch();
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.11.2016, 20:09
Ответы с готовыми решениями:

ошибка в strcpy
я переводил программу с другого языка программирования на С-язык. Там была функция substr. substr...

Линейный список и ошибка Warning: passing arg 1 of `strcpy' from incompatible pointer type
Проблема с написанием проги (линейный список). Язык Си. #include &lt;stdio.h&gt; #include &lt;string.h&gt;...

Ошибка с strcpy
Ребят, помогите! Я только начинаю изучение с++, подскажите почему при отладке компилятор выдает...

Ошибка в strcpy
Прошу помощи. Ругается на вторую строку char* EnteredText = new char; strcpy(EnteredText,...

5
6 / 6 / 1
Регистрация: 14.11.2016
Сообщений: 15
14.11.2016, 20:21 2
C++
1
2
3
4
for (int j = 0; j < 10; j++) {
            mm[i][j] = atoi(element);
            strcpy(element, strtok(NULL, " "));
        }
Это для чего?
0
0 / 0 / 0
Регистрация: 25.10.2016
Сообщений: 18
14.11.2016, 20:24  [ТС] 3
Цитата Сообщение от Yury_Yudanau Посмотреть сообщение
Это для чего?
Это дробление строки buffer в строку element, а затем element преобразуется в int и присваивается в массив
0
6 / 6 / 1
Регистрация: 14.11.2016
Сообщений: 15
14.11.2016, 20:35 4
Может длинна стороки element меньше Buffer. Используй лучше безопасную фун-цию strcpy_s.

Добавлено через 6 минут
C++
1
2
3
4
char short_string[] = "123456";//6
    char long_string[] = "123456789";//9
    strcpy_s(long_string, strlen(long_string), short_string);
    cout << strlen(long_string) << endl; //6
0
0 / 0 / 0
Регистрация: 25.10.2016
Сообщений: 18
14.11.2016, 20:42  [ТС] 5
Цитата Сообщение от Yury_Yudanau Посмотреть сообщение
Может длинна строки element меньше Buffer. Используй лучше безопасную функцию strcpy_s.
Вылетает следующее:
(((source))) != NULL
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
15.11.2016, 08:55 6
Keyrillanskiy, посмотрите как с strtok работать надо http://www.cplusplus.com/reference/cstring/strtok/
0
15.11.2016, 08:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.11.2016, 08:55
Помогаю со студенческими работами здесь

Ошибка с 'strcpy'
Решил после сдачи курсовой, для себя сделать курсовую до конца, и брать не честно стыренную у...

Ошибка использования strcpy
Добрый вечер. В строке 24 появляется ошибка: error C4996: 'strcpy': This function or variable may...

Ошибка при использовании strcpy
Здравствуйте, возникла такая проблема Объявляю массив char * char *names = {&quot;asdfg&quot;,...

Ошибка на шаге strcpy в MVS2015
Выдаёт ошибку на шаге strcpy? Что не так и как исправить? #include &quot;stdafx.h&quot; #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru