Reputation: 25518
How can I convert a mixed case string to a lowercase string in C?
Upvotes: 149
Views: 392163
Reputation: 1
You may use this user defined function:
char *ToLower(char *text){
int stringlength=strlen(text);
char *lower=(char*)malloc(sizeof(char)*stringlength);
int i=0;
while(i<stringlength){
//checking if the character is an uppercase
if((text[i]-'A')<=25){
lower[i]=text[i]+32;
}
//if the character is lowercase
else{
lower[i]=text[i];
}
i++;
}
return lower;
}
Upvotes: -1
Reputation: 65
I'm new to C and have been trying hard to convert strings from uppercase to lowercase. I made the mistake of changing the string 'A' + 32 = 'a'. And I can't solve the problem.
I used char type and finally I was able to convert it to string type. You can consult:
#include <ctype.h>
#include <stdio.h>
#include <string.h>
string convert_lower(string str)
{
int length = strlen(str);
char c[length + 1];
for (int i = 0; i < length; i++)
{
if (str[i] <= 'Z' || str[i] >= 'A')
{
c[i] = tolower((char)str[i]);
}
}
c[length] = '\0';
string text = c;
return text;
}
Upvotes: -1
Reputation: 53
If we're going to be as sloppy as to use tolower()
, do this:
char blah[] = "blah blah Blah BLAH blAH\0";
int i = 0;
while( blah[i] |=' ', blah[++i] ) {}
But, well, it kinda explodes if you feed it some symbols/numerals, and in general it's evil. Good interview question, though.
Upvotes: 2
Reputation: 5935
to convert to lower case is equivalent to rise bit 0x60 if you restrict yourself to ASCII:
for(char *p = pstr; *p; ++p)
*p = *p > 0x40 && *p < 0x5b ? *p | 0x60 : *p;
Upvotes: 11
Reputation: 374
Looping the pointer to gain better performance:
#include <ctype.h>
char* toLower(char* s) {
for(char *p=s; *p; p++) *p=tolower(*p);
return s;
}
char* toUpper(char* s) {
for(char *p=s; *p; p++) *p=toupper(*p);
return s;
}
Upvotes: 7
Reputation: 63805
It's in the standard library, and that's the most straight forward way I can see to implement such a function. So yes, just loop through the string and convert each character to lowercase.
Something trivial like this:
#include <ctype.h>
for(int i = 0; str[i]; i++){
str[i] = tolower(str[i]);
}
or if you prefer one liners, then you can use this one by J.F. Sebastian:
for ( ; *p; ++p) *p = tolower(*p);
Upvotes: 213