This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

is this a string bug?


In chapter 5 of the new Stroustrup edition there is the program
shown below.  It produces:

> ahab% a.out
> aa bb aa bb aa cc  <return><ctrl-D>
> cc: 6

while Bjarne says it should produce:

   aa: 3
   bb: 2
   cc: 1

In the debugger you can see that buf (and s) becomes the same string as
the string in pairs[0] so the "if (s == pairs[i].name)" comparison is
always true after the first time through.  This is with:

ahab% gcc -v
Reading specs from
/usr/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.10/specs
gcc version egcs-2.90.10 970924 (gcc2-970802 experimental)

and also a newer egcs on my home computer.


ahab% more pairs.cc
#include <iostream.h>
#include <vector.h>
#include <string>

struct Pair {
    string name;
    double val;
};

vector<Pair> pairs;

double& value(const string& s)
/*
 * maintain a set of Pairs:
 * search for s, return its value if found; otherwise make a new Pair
 * and return the default value 0
 */
{
    for (int i = 0; i < pairs.size(); i++)
        if (s == pairs[i].name) return pairs[i].val;
    Pair p = {s, 0};
    pairs.push_back(p);
    return pairs[pairs.size() - 1].val;
}

int main()
{
    string buf;
    while (cin >> buf) value(buf)++;
    for (vector<Pair>::const_iterator p = pairs.begin();
            p != pairs.end(); ++p)
        cout << p->name << ": " << p->val << '\n';
}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]