How to convert std::string to lower case?

后端 未结 26 1707
旧时难觅i
旧时难觅i 2020-11-22 00:01

I want to convert a std::string to lowercase. I am aware of the function tolower(), however in the past I have had issues with this function and it

26条回答
  •  悲&欢浪女
    2020-11-22 00:27

    There is a way to convert upper case to lower WITHOUT doing if tests, and it's pretty straight-forward. The isupper() function/macro's use of clocale.h should take care of problems relating to your location, but if not, you can always tweak the UtoL[] to your heart's content.

    Given that C's characters are really just 8-bit ints (ignoring the wide character sets for the moment) you can create a 256 byte array holding an alternative set of characters, and in the conversion function use the chars in your string as subscripts into the conversion array.

    Instead of a 1-for-1 mapping though, give the upper-case array members the BYTE int values for the lower-case characters. You may find islower() and isupper() useful here.

    enter image description here

    The code looks like this...

    #include 
    static char UtoL[256];
    // ----------------------------------------------------------------------------
    void InitUtoLMap()  {
        for (int i = 0; i < sizeof(UtoL); i++)  {
            if (isupper(i)) {
                UtoL[i] = (char)(i + 32);
            }   else    {
                UtoL[i] = i;
            }
        }
    }
    // ----------------------------------------------------------------------------
    char *LowerStr(char *szMyStr) {
        char *p = szMyStr;
        // do conversion in-place so as not to require a destination buffer
        while (*p) {        // szMyStr must be null-terminated
            *p = UtoL[*p];  
            p++;
        }
        return szMyStr;
    }
    // ----------------------------------------------------------------------------
    int main() {
        time_t start;
        char *Lowered, Upper[128];
        InitUtoLMap();
        strcpy(Upper, "Every GOOD boy does FINE!");
    
        Lowered = LowerStr(Upper);
        return 0;
    }
    

    This approach will, at the same time, allow you to remap any other characters you wish to change.

    This approach has one huge advantage when running on modern processors, there is no need to do branch prediction as there are no if tests comprising branching. This saves the CPU's branch prediction logic for other loops, and tends to prevent pipeline stalls.

    Some here may recognize this approach as the same one used to convert EBCDIC to ASCII.

提交回复
热议问题