Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > Problem with character string loop and strlen()

Reply
Thread Tools

Problem with character string loop and strlen()

 
 
No Such Luck
Guest
Posts: n/a
 
      07-07-2005

I have a function which requires me to loop from the end of a string to
the beginning on a char by char basis:

int foo (char string[])
{
unsigned int i;

for(i = strlen(string); i >= 0; i--)
{
/* do something */
}

return 1;
}

Here is my problem. strlen() returns an unsigned value, so if I use a
signed loop variable, I receive a warning: "'<' : signed/unsigned
mismatch"

However, if I use a unsigned loop variable to compare against the
correct return type of strlen(), the loop never ends. The value of 'i'
turns from 0 to the highest unsigned value possible.

Any ideas on how to solve this problem, and not receive the warning?

Thanks,

P.S. Traversing the string forwards is not an option.

 
Reply With Quote
 
 
 
 
Dave Vandervies
Guest
Posts: n/a
 
      07-07-2005
In article <(E-Mail Removed) .com>,
No Such Luck <(E-Mail Removed)> wrote:
>
>I have a function which requires me to loop from the end of a string to
>the beginning on a char by char basis:
>
>int foo (char string[])
>{
> unsigned int i;
>
> for(i = strlen(string); i >= 0; i--)
> {
> /* do something */
> }
>
> return 1;
>}
>
>Here is my problem. strlen() returns an unsigned value, so if I use a
>signed loop variable, I receive a warning: "'<' : signed/unsigned
>mismatch"


Are you sure? I don't see any way for the code you posted to produce
a warning anything like that.


>However, if I use a unsigned loop variable to compare against the
>correct return type of strlen(), the loop never ends. The value of 'i'
>turns from 0 to the highest unsigned value possible.
>
>Any ideas on how to solve this problem, and not receive the warning?


Don't compare signed values with unsigned values.

Or (sometimes better, depending heavily on philosophical and aesthetic
opinions) just document that the code produces a warning and why the
warning should be ignored.


dave

--
Dave Vandervies http://www.velocityreviews.com/forums/(E-Mail Removed)
More proof that the surefire way to discover the answer to your question
is to ask it in a public forum.
--Peter Ammon in comp.lang.c
 
Reply With Quote
 
 
 
 
Peter Nilsson
Guest
Posts: n/a
 
      07-07-2005
No Such Luck wrote:
> I have a function which requires me to loop from the end of a string to
> the beginning on a char by char basis:
>
> int foo (char string[])
> {
> unsigned int i;
>
> for(i = strlen(string); i >= 0; i--)


Why do you want to loop if the string is empty?

> {
> /* do something */
> }
>
> return 1;
> }
>
> Here is my problem. strlen() returns an unsigned value,


More precisely it returns the best type for indexing, namely, size_t.

> so if I use a signed loop variable, I receive a warning: "'<' :
> signed/unsigned mismatch"
>
> However, if I use a unsigned loop variable to compare against the
> correct return type of strlen(), the loop never ends. The value of 'i'
> turns from 0 to the highest unsigned value possible.
>
> Any ideas on how to solve this problem, and not receive the warning?


A compiler can issue a warning for any reason it likes, so no one
can guarantee you won't get a warning, but the following may be what
you're after...

size_t i = strlen(string);
while (i--)
{
putchar(string[i]);
}

--
Peter

 
Reply With Quote
 
Al Bowers
Guest
Posts: n/a
 
      07-08-2005


No Such Luck wrote:
> I have a function which requires me to loop from the end of a string to
> the beginning on a char by char basis:
>
> int foo (char string[])
> {
> unsigned int i;
>
> for(i = strlen(string); i >= 0; i--)
> {
> /* do something */
> }
>
> return 1;
> }
>
> Here is my problem. strlen() returns an unsigned value, so if I use a
> signed loop variable, I receive a warning: "'<' : signed/unsigned
> mismatch"
>
> However, if I use a unsigned loop variable to compare against the
> correct return type of strlen(), the loop never ends. The value of 'i'
> turns from 0 to the highest unsigned value possible.
>
> Any ideas on how to solve this problem, and not receive the warning?
>


Yes. There is no need to do the test i >= 0 when the test
can easily be made i > 0. This would solve the problem.
Example:

#include <string.h>
#include <stdio.n>

void foo (const char string[])
{
size_t i;

for(i = strlen(string); i > 0; i--)
putchar(string[i-1]);
putchar('\n');
}

--
Al Bowers
Tampa, Fl USA
mailto: (E-Mail Removed) (remove the x to send email)
http://www.geocities.com/abowers822/

 
Reply With Quote
 
CBFalconer
Guest
Posts: n/a
 
      07-08-2005
No Such Luck wrote:
>
> I have a function which requires me to loop from the end of a string to
> the beginning on a char by char basis:
>
> int foo (char string[])
> {
> unsigned int i;
>
> for(i = strlen(string); i >= 0; i--)
> {
> /* do something */
> }
> return 1;
> }
>
> Here is my problem. strlen() returns an unsigned value, so if I use a
> signed loop variable, I receive a warning: "'<' : signed/unsigned
> mismatch"
>
> However, if I use a unsigned loop variable to compare against the
> correct return type of strlen(), the loop never ends. The value of 'i'
> turns from 0 to the highest unsigned value possible.
>
> Any ideas on how to solve this problem, and not receive the warning?


ix = 1 + strlen(string);
while (ix--) {
/* do something. string[ix] is last unused char */
}

--
"They that can give up essential liberty to obtain a little
temporary safety deserve neither liberty nor safety."
-- B. Franklin, 1759


 
Reply With Quote
 
Joe Wright
Guest
Posts: n/a
 
      07-09-2005
No Such Luck wrote:
> I have a function which requires me to loop from the end of a string to
> the beginning on a char by char basis:
>
> int foo (char string[])
> {
> unsigned int i;
>
> for(i = strlen(string); i >= 0; i--)
> {
> /* do something */
> }
>
> return 1;
> }
>
> Here is my problem. strlen() returns an unsigned value, so if I use a
> signed loop variable, I receive a warning: "'<' : signed/unsigned
> mismatch"
>
> However, if I use a unsigned loop variable to compare against the
> correct return type of strlen(), the loop never ends. The value of 'i'
> turns from 0 to the highest unsigned value possible.
>
> Any ideas on how to solve this problem, and not receive the warning?
>
> Thanks,
>
> P.S. Traversing the string forwards is not an option.
>


Suppose ..
char string[] = "Hello";

The constant array has length 6.
strlen(string) is 5.
The five subscripts are 0..4

for (i = strlen(string); i > 0; --i)

will loop for i == 5..1

treat the individual characters with string[i-1]

You can define
int i;
such that i is signed. Regard..

for (i = strlen(string)-1; i >= 0; --i)

will loop for i == 4..0
--
Joe Wright
"Everything should be made as simple as possible, but not simpler."
--- Albert Einstein ---
 
Reply With Quote
 
CBFalconer
Guest
Posts: n/a
 
      07-09-2005
Joe Wright wrote:
>

.... snip ...
>
> You can define
> int i;
> such that i is signed. Regard..
>
> for (i = strlen(string)-1; i >= 0; --i)
>
> will loop for i == 4..0


You will get a nasty surprise when strlen(string) is zero.

--
"If you want to post a followup via groups.google.com, don't use
the broken "Reply" link at the bottom of the article. Click on
"show options" at the top of the article, then click on the
"Reply" at the bottom of the article headers." - Keith Thompson


 
Reply With Quote
 
Peter Nilsson
Guest
Posts: n/a
 
      07-09-2005
CBFalconer wrote:
> Joe Wright wrote:
> >

> ... snip ...
> >
> > You can define
> > int i;
> > such that i is signed. Regard..
> >
> > for (i = strlen(string)-1; i >= 0; --i)
> >
> > will loop for i == 4..0

>
> You will get a nasty surprise when strlen(string) is zero.


Unfortunately, chances are he won't. On most modern systems
where the conversion from unsigned to signed is simply a
no-op or truncation in twos complement representation, programs
like...

#include <stdio.h>

int main(void)
{
int i = 0u - 1;
printf("%d\n", i);
return 0;
}

....will output -1 as 'expected'.

The issue CBFalconer is hinting at is the fact that size_t is
unsigned and often unsigned int or unsigned long. Because of
promotion, the subtraction of 1 from such unsigned integers
will yield UINT_MAX or ULONG_MAX where both are likely to be
outside the range of int. If so, these values will then be
converted in an implementation defined way back into int in
the assignment to i. [Under C99, an implementation defined
signal can even be raised.] There is no guarantee that i will
get the value -1 on every conforming implementation.

--
Peter

 
Reply With Quote
 
Old Wolf
Guest
Posts: n/a
 
      07-09-2005
No Such Luck wrote:
> I have a function which requires me to loop from the end of a string to
> the beginning on a char by char basis:
>
> int foo (char string[])
> {
> unsigned int i;
>
> for(i = strlen(string); i >= 0; i--)
> {
> /* do something */
> }
>
> return 1;
> }
>
> if I use a unsigned loop variable to compare against the
> correct return type of strlen(), the loop never ends. The value
> of 'i' turns from 0 to the highest unsigned value possible.


unsigned int i;
for (i = strlen(string); i--; )
{
/* do something */
}

 
Reply With Quote
 
Joe Wright
Guest
Posts: n/a
 
      07-10-2005
Old Wolf wrote:
> No Such Luck wrote:
>
>>I have a function which requires me to loop from the end of a string to
>>the beginning on a char by char basis:
>>
>>int foo (char string[])
>>{
>> unsigned int i;
>>
>> for(i = strlen(string); i >= 0; i--)
>> {
>> /* do something */
>> }
>>
>> return 1;
>>}
>>
>>if I use a unsigned loop variable to compare against the
>>correct return type of strlen(), the loop never ends. The value
>>of 'i' turns from 0 to the highest unsigned value possible.

>
>
> unsigned int i;
> for (i = strlen(string); i--; )
> {
> /* do something */
> }
>

I like that.

--
Joe Wright
"Everything should be made as simple as possible, but not simpler."
--- Albert Einstein ---
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Triple nested loop python (While loop insde of for loop inside ofwhile loop) Isaac Won Python 9 03-04-2013 10:08 AM
Convert string with control character in caret notation to realcontrol character string. Bart Vandewoestyne C Programming 8 09-25-2012 12:41 PM
How can I replace all occurrences of a character with another character in std string? herman C++ 5 08-30-2007 09:05 AM
8 bit character string to 16 bit character string Brand Bogard C Programming 8 05-28-2006 05:05 PM
getting the character code of a character in a string Velvet ASP .Net 9 01-19-2006 09:27 PM



Advertisments