Reverse the ordering of words in a string

后端 未结 30 4238
青春惊慌失措
青春惊慌失措 2020-11-22 10:23

I have this string s1 = \"My name is X Y Z\" and I want to reverse the order of the words so that s1 = \"Z Y X is name My\".

I can do it u

30条回答
  •  爱一瞬间的悲伤
    2020-11-22 11:01

    This is not perfect but it works for me right now. I don't know if it has O(n) running time btw (still studying it ^^) but it uses one additional array to fulfill the task.

    It is probably not the best answer to your problem because i use a dest string to save the reversed version instead of replacing each words in the source string. The problem is that i use a local stack variable named buf to copy all the words in and i can not copy but into the source string as this would lead to a crash if the source string is const char * type.

    But it was my first attempt to write s.th. like this :) Ok enough blablub. here is code:

    #include 
    using namespace std;
    
    void reverse(char *des, char * const s);
    int main (int argc, const char * argv[])
    {    
        char* s = (char*)"reservered. rights All Saints. The 2011 (c) Copyright 11/10/11 on Pfundstein Markus by Created";
        char *x = (char*)"Dogfish! White-spotted Shark, Bullhead";
    
        printf("Before: |%s|\n", x);
        printf("Before: |%s|\n", s);
    
        char *d = (char*)malloc((strlen(s)+1)*sizeof(char));  
        char *i = (char*)malloc((strlen(x)+1)*sizeof(char));
    
        reverse(d,s);
        reverse(i,x);
    
        printf("After: |%s|\n", i);
        printf("After: |%s|\n", d);
    
        free (i);
        free (d);
    
        return 0;
    }
    
    void reverse(char *dest, char *const s) {
        // create a temporary pointer
        if (strlen(s)==0) return;
        unsigned long offset = strlen(s)+1;
    
        char *buf = (char*)malloc((offset)*sizeof(char));
        memset(buf, 0, offset);
    
        char *p;
        // iterate from end to begin and count how much words we have
        for (unsigned long i = offset; i != 0; i--) {
            p = s+i;
            // if we discover a whitespace we know that we have a whole word
            if (*p == ' ' || *p == '\0') {
                // we increment the counter
                if (*p != '\0') {
                    // we write the word into the buffer
                    ++p;
                    int d = (int)(strlen(p)-strlen(buf));
                    strncat(buf, p, d);
                    strcat(buf, " ");
                }
            }
        }
    
        // copy the last word
        p -= 1;
        int d = (int)(strlen(p)-strlen(buf));
        strncat(buf, p, d);
        strcat(buf, "\0");
    
        // copy stuff to destination string
        for (int i = 0; i < offset; ++i) {
            *(dest+i)=*(buf+i);
        }
    
        free(buf);
    }
    

提交回复
热议问题