Игорь Пашев -

Nov. 29th, 2010

05:51 pm

Previous Entry Add to Memories Tell A Friend Next Entry

http://habrahabr.ru/blogs/sport_programming/108570/

Компиляция:

gcc -ansi -pedantic -Wall -Wextra -O2 -save-temps code.c -o code

Проверка:
# echo '123 abc 987 abaacb' | ./code
123 -> 132
abc -> acb
987 -> 
abaacb -> ababac


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

static char * next(char *str)
{
    size_t l;
    char *lc, *rc, *c, t;

    if (NULL == str) return str;
    l = strlen(str);
    if (0 == l) return str;

    for (c = str+l-1; c > str; c--)
        if (*c > *(c-1))
            break;

    if (c == str) {
        str[0] = '\0';
        return str;
    }

    rc = c;
    lc = c-1;
    for (c = rc+1; *c != '\0'; c++)
        if ((*c > *lc) && (*c < *rc))
            rc = c;

    /* Swap *lc <-> *rc */
    t = *lc;
    *lc = *rc;
    *rc = t;

    /* Reverse the tail */
    for (rc = str+l-1, lc++; lc < rc; lc++, rc--) {
        t = *lc;
        *lc = *rc;
        *rc = t;
    }
    return str;
}


int main(void)
{
    char buf[50 + 1]; /* Max length + \0 */
    int c;
    size_t i;

    i = 0;
    while ((c = getchar()) != EOF) {
        if (isalnum(c)) {
            buf[i++] = c;
            if (i >= sizeof(buf) - 1) {
                fprintf(stderr, "Buffer overflow (%d chars maximum).\n", sizeof(buf) - 1);
                return EXIT_FAILURE;
            }
        }
        else {
            buf[i] = '\0';
            printf("%s -> ", buf);
            next(buf);
            printf("%s\n", buf);
            i = 0;
        }
    }

    return EXIT_SUCCESS;
}

Tags: ,
(Оставить комментарий)