Mail Archives: djgpp/2001/09/29/02:34:44
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 -