При запуске файла возникает ошибка сегментирования (стек памяти сброшен на диск). Читал, что это может быть из-за того, что происходит утечка памяти, вчитывался в код, но никак не могу найти. Помогите, пожалуйста.
#include <sys/types.h>
#include <sys/wait.h>
#include <ctime>
#include <ncurses.h>
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstdbool>
#include <cstring>
#include <fstream>
#include <iterator>
#include <vector>
#include <string>
#include <unistd.h>
#include <clocale>
using namespace std;
const char* fileName = "URL-addresses.txt";
bool checkCorrect(char *str)
{
char *comprStr = new char[7];
strncpy(comprStr, str, 7);
if (!strcmp(comprStr,"http://"))
{
return true;
}
else return false;
}
bool searchContact(char* str)
{
char* tempLink = new char[30];
ifstream in(fileName);
if (!in.is_open()) return 0;
while (!in.eof())
{
in >> tempLink;
if (strcmp(str, tempLink) == 0) return true;
if (in.eof()) break;
}
in.close();
return false;
}
void download(char* str) {
system("clear");
ofstream out(fileName, ios_base::app);
if (!out.is_open()) exit(1);
out <<"\n" << str;
out.close();
}
int main(int argc, char* argv[]) {
setlocale (LC_ALL, "Russian");
initscr();
if (!checkCorrect(argv[1]))
{
return 2;
}
if (!searchContact(argv[1])) {
return 3;
}
switch (atoi(argv[2])) {
case 1: {
download(argv[1]);
endwin();
return 3;
}
case 2: {
download(argv[1]);
endwin();
return 3;
}
default: {
endwin();
return 4;
}
}
}
Сразу после strncpy
у вас идет strcmp
:
strncpy(comprStr, str, 7);
if (!strcmp(comprStr,"http://"))
...
Но функция strncpy
не предназначается и никогда не предназначалась для "безопасного" копирования строк. Если вам таки приспичило использовать ее для этой цели, то не забывайте, что эта функция в общем случае не завершает скопированные данные символом '\0'
. Сделать это после strncpy
- ваша обязанность.
Вас, очевидно, интересует строка длины 7. Для строки длины 7 нужно 8 байтов памяти. Восемь, а не семь. Причем выделять эту память через new []
нет никакой необходимости
char comprStr[8];
strncpy(comprStr, str, 8);
comprStr[7] = '\0';
if (!strcmp(comprStr, "http://"))
...
Для того, чтобы проверить, не начинается ли строка с "http://"
совсем не обязательно копировать ее начало в отдельную строку. Если функция strncmp
, которая это проверит без лишних копирований
bool checkCorrect(const char *str)
{
return strncmp(str, "http://", 7) == 0;
}
Ошибка сегментации возникает не при утечке памяти, а при обращении к тому участку памяти, к которому к вас нет доступа.
Вот, почитайте об этом в Википедии.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Надо было тестово собрать один проект под VS для проверки совместимости кода, в общем все собирается, но выдает следующее:
Проблема с copyВ "Task 1" все работает, но в "Task 2" после выполнения sort выводит только название группы и ссылается на
Начал изучать спринг, создал с помощью инициализатора проект и ввёл в него код-пример с этого сайтаВ итоге в проекте есть один класс:
В процессе изучения различных вариантов организации кода для пользовательского интерфейса (MVC, MVP, MVVM, MVPVM и того, что этими названиями называют)...