Hatena::Groupgeneration1986

仮想化済み古代魚

 | 

2008-07-21K&R 演習1-23

暑いです。HDDの温度が37度とか表示されてます。それなんて体温。

//P42 演習1-23 Cプログラムからコメントを削除するプログラム
//あくまで「コメント削除」であり削除した結果の空白行等は放置
#include <stdio.h>

#define	eq	==
#define	TRUE	1
#define	FALSE	0
#define	MAXLINE	1000
#define	MAXSAVE	5000


void	delcom(char s[]);		//コメント削除の本体
int	getline(char s[]);		//定番

int main(void)
{
	int 	i;		//一時保管中の文字数
	char	line[MAXLINE];
	char	save[MAXSAVE];
	
	printf("code ?");
	while(getline(line) > 0){
		delcom(line);
		printf("削除後:%s", line);
	}
	return 0;
}

void delcom(char s[])
{
	int	i;		//カウント用
	int	j;		//同上
	char	c;		//文字の一時格納

	int	flag = FALSE;	//引用符の中ならTRUE
	
	for(i=0; (c=s[i]) != EOF && c != '\0'; i++){
		if (c eq '"'){			//printf等の中身かどうか?
			if (flag eq FALSE)	//引用符の中である
				flag = TRUE;
			else if (flag eq TRUE)	//引用符の外
				flag = FALSE;
			}

		//「//」コメント削除
		if(flag eq FALSE && c eq '/' && s[i+1] eq '/')
		{
			for (; s[i]!=EOF && s[i]!='\n'; i++)
				s[i] = ' ';
		}
						
		//「/**/」コメント削除開始
		else if (flag eq FALSE && c eq '/' && s[i+1] eq '*')
		{
			s[i] = s[i+1] = ' ';
			//右辺まで削除
			for(i; s[i]!='*' && s[i+1]!='/'; i++)
				s[i] = ' ';
			
			s[i] = s[i+1] = ' ';
		}
	}
}

int getline(char s[])
{
	int i;
	
	for (i = 0;i < MAXLINE && (s[i] = getchar()) != '\n' && s[i] != EOF; ++i)
		;
	if (s[i] == '\n')
		i++;
	s[i] = '\0';

	return i;
}

トラックバック - http://generation1986.g.hatena.ne.jp/oldfish/20080721
 |