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

前端 未结 30 1884
长发绾君心
长发绾君心 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:23

    In the interest of completeness, it should be pointed out that there are representations of strings on various platforms in which the number of bytes per character varies depending on the character. Old-school programmers would refer to this as DBCS (Double Byte Character Set). Modern programmers more commonly encounter this in UTF-8 (as well as UTF-16 and others). There are other such encodings as well.

    In any of these variable-width encoding schemes, the simple algorithms posted here (evil, non-evil or otherwise) would not work correctly at all! In fact, they could even cause the string to become illegible or even an illegal string in that encoding scheme. See Juan Pablo Califano's answer for some good examples.

    std::reverse() potentially would still work in this case, as long as your platform's implementation of the Standard C++ Library (in particular, string iterators) properly took this into account.

    0 讨论(0)
  • 2020-11-22 01:23

    In case you are using GLib, it has two functions for that, g_strreverse() and g_utf8_strreverse()

    0 讨论(0)
  • 2020-11-22 01:24

    I think the easiest way to reverse a string would be by using the inbuilt reverse function.

    Including the header file #include <algorithm> you can:

    #include <iostream> 
    #include <algorithm>
    
    int main() 
    { 
        std::string str = "Programming"; 
      
       
        std::reverse(str.begin(), str.end()); 
      
        std::cout << str; 
        return 0; 
    } 
    

    Output:

    gnimmargorP
    
    0 讨论(0)
  • 2020-11-22 01:25

    Use std::reverse()

    reverse(begin(str), end(str));

    And that's it.

    0 讨论(0)
  • 2020-11-22 01:26

    If you're looking for reversing NULL terminated buffers, most solutions posted here are OK. But, as Tim Farley already pointed out, these algorithms will work only if it's valid to assume that a string is semantically an array of bytes (i.e. single-byte strings), which is a wrong assumption, I think.

    Take for example, the string "año" (year in Spanish).

    The Unicode code points are 0x61, 0xf1, 0x6f.

    Consider some of the most used encodings:

    Latin1 / iso-8859-1 (single byte encoding, 1 character is 1 byte and vice versa):

    Original:

    0x61, 0xf1, 0x6f, 0x00

    Reverse:

    0x6f, 0xf1, 0x61, 0x00

    The result is OK

    UTF-8:

    Original:

    0x61, 0xc3, 0xb1, 0x6f, 0x00

    Reverse:

    0x6f, 0xb1, 0xc3, 0x61, 0x00

    The result is gibberish and an illegal UTF-8 sequence

    UTF-16 Big Endian:

    Original:

    0x00, 0x61, 0x00, 0xf1, 0x00, 0x6f, 0x00, 0x00

    The first byte will be treated as a NUL-terminator. No reversing will take place.

    UTF-16 Little Endian:

    Original:

    0x61, 0x00, 0xf1, 0x00, 0x6f, 0x00, 0x00, 0x00

    The second byte will be treated as a NUL-terminator. The result will be 0x61, 0x00, a string containing the 'a' character.

    0 讨论(0)
  • 2020-11-22 01:27

    Non-evil C, assuming the common case where the string is a null-terminated char array:

    #include <stddef.h>
    #include <string.h>
    
    /* PRE: str must be either NULL or a pointer to a 
     * (possibly empty) null-terminated string. */
    void strrev(char *str) {
      char temp, *end_ptr;
    
      /* If str is NULL or empty, do nothing */
      if( str == NULL || !(*str) )
        return;
    
      end_ptr = str + strlen(str) - 1;
    
      /* Swap the chars */
      while( end_ptr > str ) {
        temp = *str;
        *str = *end_ptr;
        *end_ptr = temp;
        str++;
        end_ptr--;
      }
    }
    
    0 讨论(0)
提交回复
热议问题