Форум программистов, компьютерный форум CyberForum.ru

Ошибка сегментирования - C++

Восстановить пароль Регистрация
 
remouter
0 / 0 / 0
Регистрация: 03.06.2011
Сообщений: 15
10.03.2013, 14:14     Ошибка сегментирования #1
Добрый день, возникла проблема:
Вот программа, суть из исходного файла у слов удаляется окончание 's' (если оно присутствует), плюс даны слова исключения, которые программа пропускает. В некоторых случаях работает нормально, в других ошибка сегментации.
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
#include <iostream>
#include <set>
#include <vector>
#include <fstream>
#include <stdexcept>
using namespace std;
int main(){
    set<string> set1;
    set1.insert("class");
    set1.insert("success");
    fstream input("in.txt", ifstream::in);
    if(!input)
              throw runtime_error("File doesn't exist");
    string word;
    ofstream output("out.txt", ofstream::out);
    input >> word;
    while (input >> word){
          cout << word << endl;
          output << word << " ";
          string::iterator iter = word.end() - 1;
          if (*iter == 's'){
                    set<string>::iterator it = set1.find(word);
                    if (*it != word){
                       word.erase(word.end() - 1);
                       }
                      cout << *iter << endl; 
          }
          
    }
    system("pause");
    return 0;
}
Если набор целочисленный или с плавающей точкой, все работает, если набор строк - ошибки.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.03.2013, 14:14     Ошибка сегментирования
Посмотрите здесь:

Ошибка сегментирования (core dumped) C++
C++ C++ Ошибка сегментирования
C++ Ошибка сегментирования.
ошибка сегментирования C++
C++ Ошибка сегментирования
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.03.2013, 14:29     Ошибка сегментирования #2
Вот в этом месте:
C++
1
set<string>::iterator it = set1.find(word);
нет обработки случая, когда word не найдено (it == -1).
remouter
0 / 0 / 0
Регистрация: 03.06.2011
Сообщений: 15
10.03.2013, 19:31  [ТС]     Ошибка сегментирования #3
Спасибо
remouter
0 / 0 / 0
Регистрация: 03.06.2011
Сообщений: 15
11.03.2013, 21:11  [ТС]     Ошибка сегментирования #4
еще варианты будут
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
11.03.2013, 21:17     Ошибка сегментирования #5
Цитата Сообщение от remouter Посмотреть сообщение
C++
1
string::iterator iter = word.end() - 1;
Цитата Сообщение от remouter Посмотреть сообщение
C++
1
2
3
4
if (*it != word) {
   word.erase(word.end() - 1);
}
cout << *iter << endl;
В последней строке будет обращение к уже удалённому символу, если блок if выполниться.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.03.2013, 21:24     Ошибка сегментирования #6
Так не помогает:
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
#include <iostream>
#include <set>
#include <vector>
#include <fstream>
#include <stdexcept>
#include <string>
using namespace std;
 
int main(){
    set<string> set1;
    set1.insert("class");
    set1.insert("success");
    fstream input("in.txt", ifstream::in);
    if(!input)
              throw runtime_error("File doesn't exist");
    string word;
    ofstream output("out.txt", ofstream::out);
    input >> word;
    while (input >> word){
          cout << word << endl;
          output << word << " ";
          string::iterator iter = word.end() - 1;
          if (*iter == 's'){
                    set<string>::iterator it = set1.find(word);
                    if (it != set1.end())
                    {
                        if (*it != word){
                           word.erase(word.end() - 1);
                           }
                          cout << *iter << endl;
                    }
                    else cout << "The word is not found" << endl; 
          }
          
    }
    system("pause");
    return 0;
}
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11815 / 6794 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
11.03.2013, 21:37     Ошибка сегментирования #7
Попробуйте такой вариант:
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
#include <iostream>
#include <set>
#include <vector>
#include <fstream>
#include <stdexcept>
#include <string>
using namespace std;
 
int main(){
    set<string> set1;
    set1.insert("class");
    set1.insert("success");
    fstream input("in.txt", ifstream::in);
    if(!input)
              throw runtime_error("File doesn't exist");
    string word;
    ofstream output("out.txt", ofstream::out);
    input >> word;
    while (input >> word){
          cout << word << endl;
          output << word << " ";
          string::reverse_iterator iter = word.rend();
          if (*(iter.base()) == 's'){
                    set<string>::iterator it = set1.find(word);
                    if (it != set1.end())
                    {
                        if (*it != word){
                           word.pop_back();
                           }
                    }
                    else cout << "The word is not found" << endl; 
          }
          
    }
    system("pause");
    return 0;
}
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
11.03.2013, 21:38     Ошибка сегментирования #8
alsav22, iter
Цитата Сообщение от alsav22 Посмотреть сообщение
C++
1
string::iterator iter = word.end() - 1;
после
Цитата Сообщение от alsav22 Посмотреть сообщение
C++
1
word.erase(word.end() - 1);
невалидный, потом его разыменовывают:
Цитата Сообщение от alsav22 Посмотреть сообщение
C++
1
cout << *iter << endl;
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.03.2013, 22:07     Ошибка сегментирования #9
Если слово не найдено, то ошибка в этом месте выскакивала:
C++
1
 if (*it != word)
(it был рамен set1.end())

Добавлено через 5 минут
Второй if() не нужен:
C++
1
2
3
4
if (it != set1.end())
{
    word.pop_back();
}
Добавлено через 2 минуты
remouter, не знаю как у вас, но у меня без #include <string> не компилировалось.

Добавлено через 5 минут
Цитата Сообщение от gray_fox Посмотреть сообщение
невалидный, потом его разыменовывают:
И это тоже. Можно просто:
C++
1
cout << word << endl;
Добавлено через 9 минут
Этот итератор
C++
1
string::iterator iter = word.end() - 1;
здесь вообще не нужен.

Добавлено через 2 минуты
Хоть вот так:
C++
1
2
3
4
5
6
7
8
9
if ( word[word.size() - 1] == 's')
{
    set<string>::iterator it = set1.find(word);
    if (it != set1.end())
          word.erase(word.end() - 1);
    else cout << "The word is not found" << endl;
                    
    cout << word << endl;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.03.2013, 23:05     Ошибка сегментирования
Еще ссылки по теме:

Ошибка сегментирования C++
fprintf ошибка сегментирования C++
Ошибка в коде (Ошибка сегментирования (core dumped) C++

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

Или воспользуйтесь поиском по форуму:
remouter
0 / 0 / 0
Регистрация: 03.06.2011
Сообщений: 15
11.03.2013, 23:05  [ТС]     Ошибка сегментирования #10
ух, всем спасибо за ответы
Yandex
Объявления
11.03.2013, 23:05     Ошибка сегментирования
Ответ Создать тему
Опции темы

Текущее время: 20:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru