入力文字を逆転して表示する

K&R本 演習1-19

文字列sを逆に並べる関数reverse(s)を書け。さらに、この関数を使って、入力を一時に一行ずつ逆転するプログラムを書け。

#include <stdio.h>

void reverse (char *s) {
    char c;
    char *p = s;
    int i = 0;
    int j;
    
    while(*++s&&*s!='\n') { ++i; }
    
    for(j=0;i>j;--i,++j) {
        c    = p[j];
        p[j] = p[i];
        p[i] = c;
    }
}

int main(void) {
    char line[1000];
    
    while( fgets(line,sizeof(line),stdin) != NULL ) {
        reverse(line);
        printf("%s",line);
    }
    
    return 0;
}
$ cat main.c | main
>h.oidts< edulcni#

{ )s* rahc( esrever diov
;c rahc
;s = p* rahc
;0 = i tni
;j tni

} ;i++ { )'n\'=!s*&&s++*(elihw

{ )j++,i--;j>i;0=j(rof
;]j[p =    c
;]i[p = ]j[p
;c = ]i[p
}
}

{ )diov(niam tni
;]0001[enil rahc

{ ) LLUN =! )nidts,)enil(foezis,enil(stegf (elihw
;)pf,)enil(foezis,enil(stegf//
} ;kaerb { ) )nidts(foef ( fi//
;)enil(esrever

;)enil,"s%"(ftnirp
}

;0 nruter
}

改行コードも反転すると表示が更にわかりにくくなったので改行コードまでの文字列の反転をしました。

また一行の長さが1000文字以上の場合は無視されます。