[comp.lang.c++] bug in cout << ?

mcdougal@gargoyle.UChicago.EDU (Thomas F. McDougal) (11/18/87)

I hope someone can help me with this.  We have no C++ wizards around here
yet, and so I have to hope that someone out there will take the time
to look this over.

I have overloaded the << operator for a particular class; the overloaded
version works fine, but now I am getting very strange behavior from cout <<
while trying to print ordinary character strings.  It ignores text and "\n"
characters, and prints everything after the first four characters at the
beginning of the string.

   The offending code:

           cout << "Done doing something...\n";
           char* w;

           while (cin >> w) {
            ...
             cout << "Could not find: "
	     cout << w;
             cout << "\n";
           }

Instead of:                              I get:

Done doing something...                  Done doing something...
Could not find: abotted                  tedabotted
Could not find: atmo                     atmo
Could not find: disciple                 ipledisciplenextwordnextwordne...
[etc...]

Note that it works fine until I enter the loop.  Note also that after
printing a few words, scrambled and without the "could not find" but at
least on different lines, cout gives up altogether and just strings the
scrambled words onto one line.

No calls are made to the overloaded version of <<.  Input is piped
from a file on the command line, like this:

          a.out < inputfile

Thanks for your time, folks.

                                      --Tom McDougal
ARPA: mcdougal@gargoyle.Uchicago.edu
UUCP: ihnp4!gargoyle!mcdougal

-- 
                           --Tom McDougal
ARPA: mcdougal@gargoyle.UChicago.edu
UUCP: ...ihnp4!gargoyle!mcdougal

ark@alice.UUCP (11/19/87)

In article <807@gargoyle.UChicago.EDU>, mcdougal@gargoyle.UUCP writes:
 
>    The offending code:
 
>            cout << "Done doing something...\n";
>            char* w;
> 
>            while (cin >> w) {
>             ...
>              cout << "Could not find: "
> 	     cout << w;
>              cout << "\n";
>            }

w doesn't point anywhere, yet you're reading into it!

You might replace

	char* w;

by

	char w[200];

or some suitably large buffer.

Of course, what you'd really like to be able to say is

	String w;

	while (cin >> w) { ...
	};

and have the String class take care of memory allocation for you.

This is left as an exercise to the reader.

joemac@apple.UUCP (11/19/87)

My mailer barfed on a R to this address so here's my reply...

in Article <807@gargoyle.UChicago.EDU> (Thomas F. McDougal) says:
>
>   The offending code:
>
>           cout << "Done doing something...\n";
>           char* w;
>
>           while (cin >> w) {
>            ...
>             cout << "Could not find: "
>	     cout << w;
>             cout << "\n";
>           }


The problem here (besides the missing ';' after "Could not find: ") is that 
no store has been allocated for the characters read from cin.  You have 
declared a char* but no real store.  

If you replace:

	char* w;

with:

	char w[BUFSIZE]; // BUFSIZE in <stdio.h>

everything is hunky-dory.

Hope this helps.

	joe   


|   UUCP:     {decwrl,sun,voder,amdahl,well,dual,unisoft}!apple!joemac	      |
|   Internet: joemac@apple.COM						      |