#99 Article 1068 Posted at 1995/12/22 23:13:42 by みやちゃん (MAP2821) [SAHOU.5]

Subject: Re: プログラミング作法・5:回文の判定 /1063

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

#define MAXLEN 80	// 1行最大文字数

int main(int argc,char **argv)
{
	unsigned short a;
	char *topdown,*bottomup;
	char sbuf[MAXLEN];
	FILE *fp;

//	1行のテキストをファイルから読む
	if(argc<2)return 1;
	fp=fopen(++*argv,"rt");
	if(fp==NULL)return 2;
	if(!fgets(sbuf,MAXLEN,fp))return 3;
	fclose(fp);

//	チェック
	a=0;
	topdown=sbuf;
	bottomup=sbuf+strlen(sbuf)-1;
	while(*topdown || topdown<bottomup ){
	//	アルファベット以外はスキップ
		while(*topdown || !isalpha(*topdown))topdown++;
		if(!*topdown)break;
		while(!isalpha(*bottomup))bottomup--;
	//	大文字に変換して比較し異なれば終了
		if(toupper(*topdown++) != toupper(*bottomup--))return 0;
		a++;
	}
	if(a>1)puts(sbuf);
	return 0;
}

使用法
	「PROGRAM」 <Filename>
			↑
			読み込ませるテキストを書いたファイル

解説
	文字列は第1引数に指定されたファイルからもらいます。
	その時点で文字列の中身はチェックしていません。

	文字列の先頭と終わりからポインタを中央方向に見ていきます。
	途中で topdown と bottomup が擦れ違ったら文字列の比較が終了したと
	みなします。ただし、記号やスペースのみで構成された文字列の場合など
	ループの条件に引っかからない場合のために終端チェックを行っています。
	有効文字が2文字以上の場合に回文と認めます。1文字は認めません。
	動作確認はしてません(ォ

							みやちゃん