davek@lakesys.UUCP (Dave Kraft) (02/13/89)
Hi,
I am taking a C class in school this semester, and the instructor gave us the
following example:
#include <stdio.h> /* Please note: I used <dos/stdio.h> in the unix
environment */
main()
{
char a, b, c, d, e;
char whats_left[20];
int x;
printf("\nKey in a bunch of characters like 1234...9cr: ");
scanf("%c%c%c", &a, &b, &c);
printf("\nYou typed in >>%c%c%c<<", a, b, c);
scanf("%c%c", &d, &e);
printf("\nYou had these left over >>%c%c<<", d, e);
putc('\n', stdout);
scanf("%s", whats_left);
printf("\n>>%s<<", whats_left);
printf("\n>>%s<<", &a);
x = getchar();
if(x == EOF)
printf("\nInput stream empty.");
else;
printf("\nGot back >>%d%x<<", x, x);
}
I have entered and compiled this on Turbo C 1.5, and it runs like it should.
I enter: 123456789
and the first thing it prints is the >>123<<, then >>45<<, then >>6789<<,
then >>123456789<<, and I get 'Got back >>10a<<'
On the Unix system I enter the same numbers, and I get >>123<< >>45<< >>6789<<
and here's one of the kludges: >>126789<<, and for 'Got back', it shows
>>00<<.. Why?
Also, when I try to re-direct as follows:
1) example > output
123456789 (<-- what I type in after (1))
then I get a core dump, and a message (do not remember exactly,
will redo and post)
2) example < numlist > output (numlist contains 123456789)
I get the same core dump as in (1). Why??
Any help would be appriciated.
Dave
);
--
davek@lakesys.lakesys.com
uunet!marque!lakesys!davekmarcoz@MARCOZ.BOLTZ.CS.CMU.EDU (Marco Zagha) (02/13/89)
In article <376@lakesys.UUCP> davek@lakesys.UUCP (Dave Kraft) writes: [...] > main() > { > char a, b, c, d, e; > > [...] > > printf("\n>>%s<<", &a); > [...] > } As far as your core dump problem goes, you are trying to treat the address of a single character as a string. A string (in the printf sense) is a pointer to a NULL TERMINATED string of characters. You should be using the %c specifier as in other parts of your code. == Marco (marcoz@cs.cmu.edu) --
maart@cs.vu.nl (Maarten Litmaath) (02/14/89)
davek@lakesys.UUCP (Dave Kraft) writes:
\...
\ char a, b, c, d, e;
\...
\ printf("\n>>%s<<", &a);
^^
You're telling printf() to expect a string, i.e. the address of the first of a
sequence of bytes, TERMINATED BY A '\0' BYTE; instead you supply printf() with
the address of 1 char. Use `%c' and delete the `&'.
\...
\ if(x == EOF)
\ printf("\nInput stream empty.");
\ else;
^
Probably you didn't intend that.
--
"I love it |Maarten Litmaath @ VU Amsterdam:
when a plan comes together." |maart@cs.vu.nl, mcvax!botter!maartpathak@s.cs.uiuc.edu (02/15/89)
Your professor seems to be assuming that the complier will initialize each
var in consecutive memory location. TC1.5 did that so:
printf("%s",&a); gave you 123456789. However the Unix machine didn't
use consecutive memory locations so you got the kludge.
The reason Turbo gave you a 10a for an answer is that it read in your
return key. Why it did this is a mystery. The Unix version worked
correctly because it gave you a null which is the proper terminated of
an input stream.
Heeren Pathak
s.cs.uiuc.edu
zaphod.ncsa.uiuc.edupathak@s.cs.uiuc.edu (02/15/89)
Oh one more thing, I hope your instructor gave this as an example so NON PORTABLE code because it will give you different results every time you use switch compliers. Heeren Pathak s.cs.uiuc.edu zaphod.ncsa.uiuc.edu