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.

user2450044
  • 59
  • 1
  • 1
  • 3
  • You can use [`isalpha`](http://www.cplusplus.com/reference/cctype/isalpha/) to remove the non-alpha characters. – squiguy Jun 04 '13 at 03:26
  • 1
    `isupper` and `tolower` applies only to a single char, not string. – Yu Hao Jun 04 '13 at 03:26
  • @Yu Hao so there is no way to apply it to string? – user2450044 Jun 04 '13 at 03:29
  • You need to use `for` to iterate through every char of the string, check out http://stackoverflow.com/questions/2661766/c-convert-a-mixed-case-string-to-all-lower-case – Yu Hao Jun 04 '13 at 03:34

3 Answers3

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).

Jerry Coffin
  • 476,176
  • 80
  • 629
  • 1,111
3

Try this

for(i = 0; foo[i]; i++){
  foo[i] = tolower(foo[i]);
}
Bill
  • 5,263
  • 6
  • 35
  • 50
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]);
}
Grzegorz Piwowarek
  • 13,172
  • 8
  • 62
  • 93