How do you reverse a string in place in C or C++?

前端 未结 30 2473
长发绾君心
长发绾君心 2020-11-22 00:37

How do you reverse a string in C or C++ without requiring a separate buffer to hold the reversed string?

30条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2020-11-22 01:27

    #include 
    #include 
    #include 
    #include 
    
    unsigned char * utf8_reverse(const unsigned char *, int);
    void assert_true(bool);
    
    int main(void)
    {
        unsigned char str[] = "mañana mañana";
        unsigned char *ret = utf8_reverse(str,  strlen((const char *) str) + 1);
    
        printf("%s\n", ret);
        assert_true(0 == strncmp((const char *) ret, "anãnam anañam", strlen("anãnam anañam") + 1));
    
        free(ret);
    
        return EXIT_SUCCESS;
    }
    
    unsigned char * utf8_reverse(const unsigned char *str, int size)
    {
        unsigned char *ret = calloc(size, sizeof(unsigned char*));
        int ret_size = 0;
        int pos = size - 2;
        int char_size = 0;
    
        if (str ==  NULL) {
            fprintf(stderr, "failed to allocate memory.\n");
            exit(EXIT_FAILURE);
        }
    
        while (pos > -1) {
    
            if (str[pos] < 0x80) {
                char_size = 1;
            } else if (pos > 0 && str[pos - 1] > 0xC1 && str[pos - 1] < 0xE0) {
                char_size = 2;
            } else if (pos > 1 && str[pos - 2] > 0xDF && str[pos - 2] < 0xF0) {
                char_size = 3;
            } else if (pos > 2 && str[pos - 3] > 0xEF && str[pos - 3] < 0xF5) {
                char_size = 4;
            } else {
                char_size = 1;
            }
    
            pos -= char_size;
            memcpy(ret + ret_size, str + pos + 1, char_size);
            ret_size += char_size;
        }    
    
        ret[ret_size] = '\0';
    
        return ret;
    }
    
    void assert_true(bool boolean)
    {
        puts(boolean == true ? "true" : "false");
    }
    

提交回复
热议问题