How to set a string to all lowercase [duplicate]

2019-04-29 20:59发布

问题:

This question already has an answer here:

  • How do I lowercase a string in C? [closed] 5 answers

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.

回答1:

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



回答2:

Try this

for(i = 0; foo[i]; i++){
  foo[i] = tolower(foo[i]);
}


回答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]);
}