Реверсивные слова предложения? - PullRequest
0 голосов
/ 08 февраля 2011

Я не понимаю, что я делаю не так. Похоже, это должно работать:

Вызов reverse_reverse («этот дом синий»); сначала нужно распечатать "этот дом синий", затем "синий дом этот" ..

void reverse_reverse(char * str) {
    char temp;

    size_t len = strlen(str) - 1;
    size_t i;
    size_t k = len;

    for(i = 0; i < len; i++) {
        temp = str[k];
        str[k] = str[i];
        str[i] = temp;
        k--;

        if(k == (len / 2)) {
            break;
        }
    }

    cout << str << endl;

    i = 0;
    for(k = 0; k < len; k++) {
        if(str[k] == ' ') {
            size_t a = k;
            for(size_t b = i; b < k; b++) {
                temp = str[b];
                str[b] = str[a];
                str[a] = temp;
                a--;

                if(a == (((k - i) / 2) + i)) {
                    break;
                }
            }
        }
        i = k + 1;
    }

    cout << str << endl;
}

Ответы [ 3 ]

5 голосов
/ 08 февраля 2011

У вас есть

i = k+1

и затем цикл for

for(size_t b = i; b < k; b++)

Это никогда не войдет как i > k до начала цикла и, таким образом, b > k.

Возможно, вы хотели иметь эту строку в блоке if:

if (str[k] == ' ') {  
...

    i = k+1; // <----- Here
}
// i = k+1; // Instead of here.

Не думаю, что это тоже сработает, но сделает вас намного ближе к тому, что вы желаете.

1 голос
/ 08 февраля 2011

Было бы проще читать, понимать и отлаживать ваш код, если бы он был проще.Обратите внимание, что вы повторяете код, чтобы изменить последовательность символов в двух разных местах - вы должны использовать подпрограмму.Более простой, интуитивно понятный и быстрый алгоритм, чем тот, который вы используете:

/* reverse s[first ... last] in place */
void reverse(char* s, int first, int last){
    for( ; first < last; first++, last-- ){
        char c = s[first];
        s[first] = s[last];
        s[last] = c;
    }
}

Тогда ваша программа сводится к чему-то простому:

void reverse_reverse(char* s) {
    int len = strlen(s);
    reverse(s, 0, len - 1);

    for( int word = 0, i = 0;; i++ ){
        if( i == len || s[i] == ' ' ){
            reverse(s, word, i-1);
            if( i == len ) break;
            word = i + 1;
        }
    }
}

Обратите внимание, что я перенес конец теставнутри цикла for для обработки последнего слова в строке, если за ним не стоит пробел.

0 голосов
/ 08 февраля 2011

Вместо того, чтобы переворачивать всю строку один раз, а затем каждое слово в другой раз, вы можете сделать что-то вроде этого:

void reverse(const char *s)
{
    int e = strlen(s) - 1;
    int b = e;
    while (b) {
        while (b && s[b - 1] != ' ') 
            b--;
        int i;
        for (i = b; i <= e; ++i)
            putchar(s[i]);
        while (b && s[b - 1] == ' ') {
            printf(" ");
            b--;
        }
        e = b - 1;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...