Input/output trouble cause segmentation fault

Asked by Edward Benson on 2011-07-13

Dear advanced c/g++ programers:

  A program request me to enter twice input
that program probably is tested good on visual c++ 7.1 on window xp,
but my system is g++(4.5.2) on linux(Ubuntu10.04)(kernel 2.6-35-25)
It assume
Enter some strings: a b c d
^Z
Enter some more strings: d e f g
^Z
Union: a b c d e f g
Difference: a b c
Intersection: d
all these you can get from page 273 and 274 of book(c++ cookbook)

but my test result is
-------------------------------
eric@eric-laptop:~/cppcookbook/ch7$ ./a.out
Enter a series of strings: a b c d
^Z
[7]+ Stopped ./a.out
eric@eric-laptop:~/cppcookbook/ch7$ ./a.out
Enter a series of strings: a b c d
{a, b, c, d}
Segmentation fault
-------------------------------------------------------------------
second case , I used <Enter><Control-D>
first case, I used <Enter><Control-Z>

the following is the program I tested, you still can download from
http://examples.oreilly.com/9780596007614/
------------------------------------------------------------------------------------------------
// Example 7-8. Unsing set operations
#include <iostream>
#include <algorithm>
#include <string>
#include <set>
#include <iterator>
#include "utils.h" // For parintContainer(): see 7.10

using namespace std;

int main() {

  cout << "Enter some strings: "
  istream_iterator<string> start(cin);
  istream_iterator<string> end;
  set<string> s1(start, end);

  cin.clear();

  cout << "Enter some more strings: ";
  set<string> s2(++start, end);

  set<string> setUnion;
  set<string> setInter;
  set<string> setDiff;

  set_union(s1.begin(), s1.end(),
            s2,begin(), s2.end(),
            inserter(setUnion, setUnion.begin()));

  set_difference(s1.begin(), s1.end(),
                 s2.begin(), s2.end(),
                 inserter(setDiff, setDiff.begin()));

  cout << "Union:\n";
  printContainer(setUnion);
  cout << "Difference:\n";
  printContainer(setDiff);
  cout << "Intersection:\n";
  printContainer(setinter);
}
--------------------------------------------------------------------------------------------------
utils.h
-------------------------------
// Example 7-12. Writing your own printing function
#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>
#include <vector>

using namespace std;

template<typename C>
void printContainer(const C& c, char delim = ',', ostream& out = cout)
{
   printRange(c.begin(), c.end(), delim, out);
}

template<typename Fwd>
void printRange(Fwd first, Fwd last, char delim = ',', ostream& out =
cout) {
   out << "{";
   while (first != last) {
     out << *first;
     if (++first != last)
        out << delim << ' ';
   }
   out << "}" << endl;
}
------------------------------------------------------------------------------------------------------------------
Ned and thanks your help a lot in advance
Eric

Question information

Language:
English Edit question
Status:
Answered
For:
Ubuntu gcc-defaults Edit question
Assignee:
No assignee Edit question
Last query:
2011-07-13
Last reply:
2011-07-14
mycae (mycae) said : #1

The example you post does not compile. Are you sure you have not made an error keying it in? For example, if you mix up s1 and s2's iterators, you would see such a segfault.

Fixing these compile errors means the result works for me.

Note that ctrl+z does not terminate a program -- it "pauses" execution. Ctrl+C sends a terminate signal to the program.

Manfred Hampl (m-hampl) said : #2

Must really be a typo error:
In the middle line of this snippet

  set_union(s1.begin(), s1.end(),
            s2,begin(), s2.end(),
            inserter(setUnion, setUnion.begin()));

the first comma should most probably be a dot to make it

  set_union(s1.begin(), s1.end(),
            s2.begin(), s2.end(),
            inserter(setUnion, setUnion.begin()));

Can you help with this problem?

Provide an answer of your own, or ask Edward Benson for more information if necessary.

To post a message you must log in.