Обратная строка без strtok в C - PullRequest
0 голосов
/ 18 февраля 2020

Работа над программой, которая использует RPN (обратный полис sh нотация).

У меня есть функция, которая переворачивает все слова строки без использования strtok или запуска printf (в отличие от всех решения можно найти в Интернете и здесь).

Функция фактически работает частично, поскольку печатает все слова данной строки, кроме последней, и мне нужна помощь, чтобы выяснить, что происходит.

char *extract(char s[]) {
    if (s[0] == '\0') 
        return NULL;
    int i = 0;
    char *p = NULL;
    while (s[i] != '\0') {
        if (s[i] == ' ')
            p = s + i;
        i++;
    }
    if (p != NULL) {
        *p = '\0';
        return p + 1;
    }
}

И затем он вызывается в main следующим образом:

char s[MAX] = "5 60 +";
while(s != NULL){
    printf("%s\n", extract(s));
}

Выход + 60 с курсором, который искренне ждет чего-то, но ожидаемый вывод должен быть + 60 5

1 Ответ

0 голосов
/ 18 февраля 2020

Стандартный подход заключается в обращении каждого слова в строке и затем в обратном порядке всей строки.

Вот и вы.

#include <stdio.h>
#include <string.h>

static char * reverse( char *s, size_t n )
{
    for ( size_t i = 0; i < n / 2; i++ )
    {
        char c = s[ i ];
        s[ i ] = s[ n - i - 1 ];
        s[ n - i - 1 ] = c;
    }

    return s;
}

char * reverse_by_words( char *s )
{
    const char *delim = " \t";

    char *p = s;

    while ( *p )
    {
        p += strspn( p, delim );

        if ( *p )
        {
            char *q = p;

            p += strcspn( p, delim );

            reverse( q, p - q );
        }
    }

    return reverse( s, p - s );
}

int main(void) 
{
    char s[] = "5 60 +";

    puts( s );

    puts( reverse_by_words( s ) );

    return 0;
}

Вывод программы:

5 60 +
+ 60 5

Если вы хотите сохранить начальные и конечные пробелы, как они были в исходной строке, функции могут выглядеть следующим образом

#include <stdio.h>
#include <string.h>

static char *reverse( char *s, size_t n )
{
    for ( size_t i = 0; i < n / 2; i++ )
    {
        char c = s[i];
        s[i] = s[n - i -1 ];
        s[n - i - 1] = c;
    }

    return s;
}

char * reverse_by_words( char *s )
{
    const char *delim = " \t";

    char *first = s, *last = s;

    for ( char *p = s;  *p; )
    {
        p += strspn( p, delim );

        if ( last == s ) first = last = p;


        if ( *p )
        {
            char *q = p;

            p += strcspn( p, delim );

            last = p;

            reverse( q, p - q );
        }
    }

    reverse( first, last - first );

    return s;
}

int main(void) 
{
    char s[] = "\t\t\t5 60 +";

    printf( "\"%s\"\n", s );

    printf( "\"%s\"\n", reverse_by_words( s ) );

    return 0;
}

Вывод программы:

"           5 60 +"
"           + 60 5"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...