How to set a string to all lowercase [duplicate]
Asked Answered
E

3

5

I have a char foo[SIZE]; //(string)

and have inputed it correctly using %s (as in it printfs the correct input), but now want to set it to lowercase. So I tried using

 if (isupper(*foo)) 
   *foo=tolower(*foo); 

ie when I do:

printf("%s" foo); //I get the same text with upper case

The text does not seem to change. Thank you.

Eartha answered 4/6, 2013 at 3:20 Comment(4)
You can use isalpha to remove the non-alpha characters.Compression
isupper and tolower applies only to a single char, not string.Pashto
@Yu Hao so there is no way to apply it to string?Eartha
You need to use for to iterate through every char of the string, check out #2662266Pashto
H
5

foo isn't a pointer, so you don't want to use it as one. You also don't have to check whether a character is an upper-case letter before using tolower -- it converts upper to lower case, and leaves other characters unchanged. You probably want something like:

for (i=0; foo[i]; i++)
    foo[i] = tolower((unsigned char)foo[i]);

Note that when you call tolower (and toupper, isalpha, etc.) you really need to cast your input to unsigned char. Otherwise, many (most?) characters outside the basic English/ASCII character set will frequently lead to undefined behavior (e.g., in a typical case, most accented characters will show up as negative numbers).

As an aside, when you're reading the string, you don't want to use scanf with %s -- you always want to specify the string length, something like: scanf("%19s", foo);, assuming SIZE == 20 (i.e., you want to specify one less than the size. Alternatively, you could use fgets, like fgets(foo, 20, infile);. Note that with fgets, you specify the size of the buffer, not one less like you do with scanf (and company like fscanf).

Histoplasmosis answered 4/6, 2013 at 3:27 Comment(1)
+1 for the "aside...." partEmperor
E
3

Try this

for(i = 0; foo[i]; i++){
  foo[i] = tolower(foo[i]);
}
Emperor answered 4/6, 2013 at 3:25 Comment(3)
what does the foo[i] in the middle of the for loop mean? is that like i<foo?Eartha
@Eartha your char array is/should be null terminated...and then that foo[i] is evaluated to false when the end of the array is reached.Emperor
@Eartha You can use foo[i] != '\0', but NOT i <'\0'.Emperor
C
3

*foo=tolower(*foo); //doing *(foo+i) or foo[i] does not work either

because all of those options do not make sense

You should use it like this:

for(i = 0; foo[i] != '\0'; i++){
    foo[i] = tolower(foo[i]);
}
Cloying answered 4/6, 2013 at 3:26 Comment(4)
what does the foo[i] in the middle mean?Eartha
NULL or \0?? I think \0 is better since it is a char array.Emperor
ok, now +1 for the answer :)Emperor
@Eartha ever read about for loops in C? Make some effort man, seriously...Vivavivace

© 2022 - 2024 — McMap. All rights reserved.