Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.c > #17130

Re: Right trim string function in C

From August Karlstrom <fusionfile@gmail.com>
Newsgroups comp.lang.c
Subject Re: Right trim string function in C
Date 2012-02-11 22:18 +0100
Organization A noiseless patient Spider
Message-ID <jh6lv3$3pf$1@dont-email.me> (permalink)
References <jh3n08$6hs$1@speranza.aioe.org> <jh697n$mi8$1@dont-email.me> <0.eb9addb08316dfd98bab.20120211195810GMT.87mx8pb0rx.fsf@bsb.me.uk>

Show all headers | View raw


On 2012-02-11 20:58, Ben Bacarisse wrote:
> August Karlstrom<fusionfile@gmail.com>  writes:
>> #include<ctype.h>
>> #include<string.h>
>>
>> void trim_right(char *s)
>> {
>> 	int i;
>> 	
>> 	i = strlen(s) - 1;
>> 	while ((i>= 0)&&  isspace(s[i])) {
>> 		i--;
>> 	}
>> 	s[i + 1] = '\0';
>> }
>
> Odd things can happen when strlen(s) == 0 because strlen(s) - 1 is a
> large positive number which may or may not fit into an int (it's worse
> if it does, though that is very unlikely).  Of course, since the
> conversion to int is implementation defined, you may get -1 exactly as
> you expect, but that just means the problem might not show up in
> testing.

Thanks for pointing that out. I somewhat carelessly assumed that strlen 
returns an int.

> You can avoid the problem by sticking to unsigned arithmetic:
>
>    size_t i = strlen(s);
>    while (i-->  0&&  isspace(s[i]))
>        /* do nothing */;
>    s[i + 1] = '\0';
>
> Using unsigned wrap-around like this is a little unusual but it does
> work (unless I've messed-up of course).

For empty strings and strings containing only whitespace you rely on two 
unsigned integer wrap-arounds. Nothing wrong with that, though I find 
the side-effectful loop guard hard to understand - could you maybe read 
its meaning aloud. ;-)

Sometimes unsigned types create more problems than they solve so I would 
probably just make sure that the string is not insanely long:

#include <assert.h>
#include <ctype.h>
#include <limits.h>
#include <string.h>

void trim_right(char *s)
{
	size_t len;
	int i;
	
	len = strlen(s);
	assert(len <= INT_MAX);
	i = len - 1;
	while ((i >= 0) && isspace(s[i])) {
		i--;
	}
	s[i + 1] = '\0';
}


August

Back to comp.lang.c | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

Right trim string function in C peter <pc722@nospam.mail.com.br> - 2012-02-10 18:17 +0000
  Re: Right trim string function in C James Kuyper <jameskuyper@verizon.net> - 2012-02-10 13:36 -0500
    Re: Right trim string function in C Devil with the China Blue Dress <chine.bleu@yahoo.com> - 2012-02-10 11:00 -0800
      Re: Right trim string function in C "BartC" <bc@freeuk.com> - 2012-02-14 12:41 +0000
        Re: Right trim string function in C "BartC" <bc@freeuk.com> - 2012-02-14 14:14 +0000
          Re: Right trim string function in C Ike Naar <ike@iceland.freeshell.org> - 2012-02-15 00:03 +0000
            Re: Right trim string function in C "BartC" <bc@freeuk.com> - 2012-02-15 01:00 +0000
              Re: Right trim string function in C Ben Bacarisse <ben.usenet@bsb.me.uk> - 2012-02-15 02:08 +0000
              Re: Right trim string function in C Malcolm McLean <malcolm.mclean5@btinternet.com> - 2012-02-15 03:08 -0800
                Re: Right trim string function in C gazelle@shell.xmission.com (Kenny McCormack) - 2012-02-15 13:00 +0000
                Re: Right trim string function in C Kaz Kylheku <kaz@kylheku.com> - 2012-02-16 00:36 +0000
              Re: Right trim string function in C Kaz Kylheku <kaz@kylheku.com> - 2012-02-16 00:28 +0000
              Re: Right trim string function in C gordonb.7bjv1@burditt.org (Gordon Burditt) - 2012-03-12 03:27 -0500
                Re: Right trim string function in C China Blue Water Navy <chine.bleu@yahoo.com> - 2012-03-12 03:57 -0800
        Re: Right trim string function in C Devil with the China Blue Dress <chine.bleu@yahoo.com> - 2012-02-14 09:59 -0800
      Re: Right trim string function in C Kaz Kylheku <kaz@kylheku.com> - 2012-02-14 12:56 +0000
        Re: Right trim string function in C Devil with the China Blue Dress <chine.bleu@yahoo.com> - 2012-02-14 09:17 -0800
        Re: Right trim string function in C Malcolm McLean <malcolm.mclean5@btinternet.com> - 2012-02-14 10:10 -0800
  Re: Right trim string function in C Barry Schwarz <schwarzb@dqel.com> - 2012-02-10 11:30 -0800
    Re: Right trim string function in C James Kuyper <jameskuyper@verizon.net> - 2012-02-10 14:45 -0500
      Re: Right trim string function in C Ben Bacarisse <ben.usenet@bsb.me.uk> - 2012-02-10 22:15 +0000
        Re: Right trim string function in C James Kuyper <jameskuyper@verizon.net> - 2012-02-10 17:21 -0500
          Re: Right trim string function in C Ben Bacarisse <ben.usenet@bsb.me.uk> - 2012-02-10 23:25 +0000
          Re: Right trim string function in C Keith Thompson <kst-u@mib.org> - 2012-02-10 15:31 -0800
      Re: Right trim string function in C pete <pfiland@mindspring.com> - 2012-02-10 17:17 -0500
        Re: Right trim string function in C Devil with the China Blue Dress <chine.bleu@yahoo.com> - 2012-02-10 15:12 -0800
  Re: Right trim string function in C "Morris Keesan" <mkeesan@post.harvard.edu> - 2012-02-10 14:46 -0500
    Re: Right trim string function in C Ben Bacarisse <ben.usenet@bsb.me.uk> - 2012-02-10 21:56 +0000
      Re: Right trim string function in C James Kuyper <jameskuyper@verizon.net> - 2012-02-10 17:08 -0500
        Re: Right trim string function in C Ben Bacarisse <ben.usenet@bsb.me.uk> - 2012-02-10 23:14 +0000
          Re: Right trim string function in C David Thompson <dave.thompson2@verizon.net> - 2012-02-18 23:11 -0500
      Re: Right trim string function in C Keith Thompson <kst-u@mib.org> - 2012-02-11 12:06 -0800
      Re: Right trim string function in C Ben Bacarisse <ben.usenet@bsb.me.uk> - 2012-02-11 20:12 +0000
      Re: Right trim string function in C Tim Rentsch <txr@alumni.caltech.edu> - 2012-03-08 13:10 -0800
  Re: Right trim string function in C "Scott Fluhrer" <sfluhrer@ix.netcom.com> - 2012-02-10 15:39 -0500
  Re: Right trim string function in C Shao Miller <sha0.miller@gmail.com> - 2012-02-11 03:52 -0500
    Re: Right trim string function in C Ben Bacarisse <ben.usenet@bsb.me.uk> - 2012-02-11 13:50 +0000
      Re: Right trim string function in C Shao Miller <sha0.miller@gmail.com> - 2012-02-11 11:47 -0500
        Re: Right trim string function in C Shao Miller <sha0.miller@gmail.com> - 2012-02-11 12:20 -0500
        Re: Right trim string function in C Ben Bacarisse <ben.usenet@bsb.me.uk> - 2012-02-11 20:57 +0000
          Re: Right trim string function in C Shao Miller <sha0.miller@gmail.com> - 2012-02-11 17:43 -0500
  Re: Right trim string function in C Willem <willem@toad.stack.nl> - 2012-02-11 11:57 +0000
    Re: Right trim string function in C Willem <willem@toad.stack.nl> - 2012-02-11 18:11 +0000
  Re: Right trim string function in C August Karlstrom <fusionfile@gmail.com> - 2012-02-11 18:41 +0100
    Re: Right trim string function in C Ben Bacarisse <ben.usenet@bsb.me.uk> - 2012-02-11 19:58 +0000
      Re: Right trim string function in C Malcolm McLean <malcolm.mclean5@btinternet.com> - 2012-02-11 13:11 -0800
      Re: Right trim string function in C August Karlstrom <fusionfile@gmail.com> - 2012-02-11 22:18 +0100
        Re: Right trim string function in C Ben Bacarisse <ben.usenet@bsb.me.uk> - 2012-02-11 23:48 +0000
          Re: Right trim string function in C August Karlstrom <fusionfile@gmail.com> - 2012-02-12 02:20 +0100
          Re: Right trim string function in C Malcolm McLean <malcolm.mclean5@btinternet.com> - 2012-02-12 03:44 -0800
            Re: Right trim string function in C Ben Bacarisse <ben.usenet@bsb.me.uk> - 2012-02-12 14:01 +0000
              Re: Right trim string function in C Malcolm McLean <malcolm.mclean5@btinternet.com> - 2012-02-12 11:06 -0800
                Re: Right trim string function in C Ben Bacarisse <ben.usenet@bsb.me.uk> - 2012-02-12 19:34 +0000
                Re: Right trim string function in C Ben Bacarisse <ben.usenet@bsb.me.uk> - 2012-02-12 23:35 +0000
    Re: Right trim string function in C Barry Schwarz <schwarzb@dqel.com> - 2012-02-11 14:27 -0800
      Re: Right trim string function in C August Karlstrom <fusionfile@gmail.com> - 2012-02-12 14:40 +0100

csiph-web