www.delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/2001/09/29/10:04:09

From: "Tim Nicholson" <T DOT J DOT Nicholson AT btinternet DOT com>
Newsgroups: comp.os.msdos.djgpp
Subject: Re: Please add strrev proposal
Date: Sat, 29 Sep 2001 14:52:36 +0100
Organization: Skyforce avionics Limited
Lines: 136
Message-ID: <9p4jri$q73$1@uranium.btinternet.com>
References: <lcq8rtk1nqua2hc6rqfhmqisbd587n8t2n AT 4ax DOT com> <Xns912A8823C1399ASINANUNUR AT 132 DOT 236 DOT 56 DOT 8> <3BB50884 DOT 347A4384 AT yahoo DOT com> <hmjart4m6h7tt0vddvvg47438dijr428ob AT 4ax DOT com> <3BB55487 DOT CC4407ED AT worldnet DOT att DOT net> <vhpart0gjqnr7u2tf0ih8hdf18mlkj11br AT 4ax DOT com>
NNTP-Posting-Host: host62-7-25-244.btinternet.com
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 5.50.4133.2400
X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4133.2400
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp
Reply-To: djgpp AT delorie DOT com

If you think about it, it could not work any other way. The string only
exists in one state or the other. (i.e. forward state or reverse state) It
would therefore not be possible to pass both states to the printf() function
as parameters in the same call. The only way your reasoning could work is if
printf() were to call strref(str) having processed the first %s and, of
cource, that is not how any function works.

Tim
<Radical NetSurfer> wrote in message
news:vhpart0gjqnr7u2tf0ih8hdf18mlkj11br AT 4ax DOT com...
> OUTCH! you believe this behavior is correct, too?
>
> OMG!
>
> ...and still no incorporation of   strrev(NO_ARGS);
>
> psst: that returns the last static value of a func, in this
> case, whatever the last string that was "reversed"
> (and no, its not a C++ thingy either; but all this is another story)
>
> On Sat, 29 Sep 2001 04:54:12 GMT, Les Cargill
> <lcargill AT worldnet DOT att DOT net> wrote:
>
> >Radical, let us look at what is meant by the code snippet:
> >printf("Original String: %s\nReversed String:%s\n", s, strrev(s));
> >
> >
> >First*, s is pushed on the stack, then "strrev" is called.
> >strrev reversed the original string in place.
> >
> >Next**, the pointer return from strrev, and s ( which *are the same
value* )
> >are both pushed on the stack
> >
> >Radical, NetSurfer wrote:
> >>
> >> On Sat, 29 Sep 2001 00:28:28 GMT, CBFalconer <cbfalconer AT yahoo DOT com>
> >> wrote:
> >>
> >> >"A. Sinan Unur" wrote:
> >> >>
> >> >> Radical NetSurfer wrote in
> >> >> news:lcq8rtk1nqua2hc6rqfhmqisbd587n8t2n AT 4ax DOT com:
> >> >>
> >> >> > I would like to encourage everyone who has a need for
> >> >> > strrev to come forward and encourage the maintainers of
> >> >> > LIBC used with GCC to kindly add   strrev.
> >> >>
> >> >> Count me against this if for no other reason that the fact that I do
not
> >> >> like extra nonstandard function which solve tiny problems. If you
need the
> >> >> functionality, you can write one for your own situation. If it is
going to
> >> >> be added to a library, the solution needs to be useful to more than
just
> >> >> one person in a particular situation.
> >> >>
> >> >> Anyway, the main point of my post, however, is to point out just one
of the
> >> >> gotchas with these kinds of functions.
> >> >>
> >> >> You give the following usage example:
> >> >>
> >> >> > Example
> >> >> > printf("The reverse of %s is %s\n", str,  strrev(str) );
> >> >>
> >> >> Hmmmmm  ..... let us see using the code you suggested:
> >> >>
> >> >> /* +++Date last modified: 05-Jul-1997 */
> >> >> /*
> >> >> **  STRREV.C - reverse a string in place
> >> >> **
> >> >> **  public domain by Bob Stout
> >> >> */
> >> >>
> >> >> #include <string.h>
> >> >> #include <stdlib.h>
> >> >> #include <stdio.h>
> >> >>
> >> >> char *strrev(char *str) {
> >> >>         char *p1, *p2;
> >> >>
> >> >>         if (! str || ! *str) return str;
> >> >>         for (p1 = str, p2 = str + strlen(str) - 1; p2 > p1;
++p1, --p2)
> >> >>         {
> >> >>                 *p1 ^= *p2;
> >> >>                 *p2 ^= *p1;
> >> >>                 *p1 ^= *p2;
> >> >>         }
> >> >>         return str;
> >> >> }
> >> >>
> >> >> int main(void)
> >> >> {
> >> >>         char s[] = "This is a test.";
> >> >>         printf("Original String: %s\nReversed String:%s\n", s,
strrev(s));
> >> >>         return 0;
> >> >> }
> >> >>
> >> >> C:\var>gcc djstrrev.c -o djstrrev.exe -O2 -Wall
> >> >>
> >> >> C:\var>djstrrev
> >> >> Original String: .tset a si sihT
> >> >> Reversed String: .tset a si sihT
> >>
> >> If your compiler actually outputs both strings as reversed,
> >> THEN I am very scared your compiler is quite BROKEN.
> >>
> >> printf("format specifier1, format_specififer2", var1, func1);
> >>
> >> does:
> >> display __current__ value of   var1 FIRST using format_specifier1,
> >> __THEN__
> >> display __output__ of  funct1 using format_specifier2,
> >>
> >> If DJGPP is not doing even this trivial behavior correctly,
> >> Borland programs would never port correctly,
> >> neither would anything else for that matter.
> >>
> >> Left to right, in the order AND STATE ENCOUNTERED!
> >>
> >> ....however... __AFTER__ the call to   printf(), __THEN__
> >> 'str' will contain the result of the function call;
> >> but __NEVER__ from  __WITHIN__ the printf   as
> >> you implied.  Your post is VERY MISLEADING.
> >>
> >> >> Now, think about that.
> >> >
> >> >Thank you.  I knew there was a reason I made my equivalent
> >> >(revstring) a void function.  I just didn't know what it was :-)
>


- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019