1-19 reverse.c

書けた。

/*
 * P38 演習1-19
 *   文字列sを逆に並べる関数reverse(s)を書け。さらに、この関数を
 *   使って、入力を一時に1行ずつ逆転するプログラムを書け。
 *
 *             2007/05/29 arikui
 */


#include <stdio.h>

char* reverse(char *s){
  int i, j;
  char t;
  
  for(i = 0, j = 0; s[j] != '\0'; ++j)
    ;
  if (j < 2) return s;
  --j;
  
  while(j > i){
    t = s[j];
    s[j--] = s[i];
    s[i++] = t;
  }
  
  return s;
}


#define BUFFER_SIZE 256
char* get_line(char *buf, int size);
char* chomp(char *str);

int main(void){
  char buff[BUFFER_SIZE];
  
  while(get_line(buff, BUFFER_SIZE) != NULL){
    chomp(buff);
    printf("%s\n", reverse(buff));
  }
  
  return 0;
}


char* get_line(char *buf, int size){
  int c, i = 0;
  while((c = getchar()) != EOF){
    buf[i++] = c;
    if (i == size || c == '\n') break;
  }
  buf[i] = '\0';
  return ((c == EOF && i == 0) ? NULL : buf);
}


char* chomp(char *s){
  int i;
  if (s[0] != '\0'){
    for(i = 0; s[i] != '\0'; ++i)
      ;
    if (s[--i] == '\n')
      s[i] = '\0';
  }
  return s;
}