www.pudn.com > gc.rar > GC_8_10.C


char *ver999(char *s)               //书上的函数,在这个程序并没有用到 
{ 
	char *p=s, *q=s; 
	/*掠过前导空白符*/ 
	for(; *s == ' ' || *s == '\t' || *s == '\n'; s++); 
   for(;*s;) {   /*顺序访问字符串s中的每个字符*/ 
	  *q++ = (*s == '\t' || *s == '\n') ? ' ':*s; 
	 if(*s != ' ' && *s != '\t' && *s != '\n') s++; 
	 else               /*掠过中间连续的多余空白符*/ 
		 while(*s == ' ' || *s == '\t' || *s == '\n') s++; 
	} 
	if(q>p && *(q-1) == ' ')    /*如q>p,则已复制过非空白字符*/ 
		*(q-1)= '\0';            /*如最后复制的是空白符,将其改为字符串结束符*/ 
	else 
		*q = '\0';               /*否则添加字符串结束符*/ 
	return p; 
} 
 
 
char *ver9999(char *s)               //书上的函数,在这个程序并没有用到 
{ 
	int flg = 0; 
	char *p = s, *q = s; 
	for(; *s; s++) {              /*顺序访问字符串s中的每个字符*/ 
		if(*s == ' ' || *s == '\t' || *s == '\n')   /*遇空白类字符*/ 
			flg = (flg == 2)?1:flg; 
		else {                     /*当前字符是其他字符*/ 
			if(flg == 1) 
				*q++ = ' ';            /*遇到过空白类字符,复制一个空白符*/ 
			*q++ = *s;                /*复制当前字符*/ 
			flg = 2;                 /*一个中间空白符列处理结束*/ 
		} 
	} 
	*q = '\n'; 
	return p; 
} 
 
 
 
 
# include  
# include  
void copyach(char **q,char ch)                 /*复制一个非空白类字符*/ 
{ 
	*((*q)++) = ch; 
} 
 
void copybach(char **q,char ch)                   /*复制一个空白符和非空白类字符*/ 
{ 
	*((*q)++) = ' '; 
	*((*q)++) = ch; 
} 
 
/*状态转换表*/ 
int statbl[][3] = {{0,  2,  3},                      /*初始状态*/ 
                   {1,  2,  3},                      /*中间空白符状态*/ 
				   {1,  2,  3}};                    /*非空白符状态*/ 
 
/*语义操作表*/ 
void (*funtbl[][3])(char **,char) = {{NULL,copyach,NULL}, 
                                    {NULL,copybach,NULL}, 
									{NULL,copyach,NULL}}; 
 
char *ver(char *s)                /*识别函数*/ 
{ 
	int c,ckind, 
	status = 0;                   /*置初始状态*/ 
	char *p = s, *q = s; 
	for(;status != 3; s++)  {         /*顺序访问字符串s中的每个字符*/ 
		c = *s; 
		/*分类当前字符*/ 
		if(c == ' ' || c == '\t' || c == '\n') 
			ckind = 0;                  /*空白类字符*/ 
		else if (c == '\0') ckind = 2;  /*字符串结束符*/ 
			else ckind = 1;             /*非空白类字符*/ 
		if(funtbl[status][ckind])       /*如有转换函数*/ 
			(*funtbl[status][ckind])(&q,c);  /*执行相应函数*/ 
		status = statbl[status][ckind];      /*设置新的状态*/ 
	} 
	*q = '\0'; 
	return p; 
} 
 
void main() 
{ 
	int x;          /*选项*/ 
	char s[120], *ss,*ss2,*ss3; 
	printf("输入字符串,\n"); 
	gets(s); 
	printf("有三种方法处理字符串,输入选项1,2,3\n"); 
	printf("1\n"); 
	printf("2\n"); 
	printf("3\n"); 
	scanf("%d",&x); 
	switch(x) { 
		case 1:ss = ver(s); 
	   			printf("结果字符串为  %s,其长度为  %d",ss,strlen(ss)); 
	  			break; 
		case 2:ss2 = ver999(s); 
				printf("\n另一种方法: 结果字符串为  %s,其长度为  %d",ss2,strlen(ss2)); 
				break; 
		case 3:ss3 = ver9999(s); 
				printf("\n另一种方法: 结果字符串为  %s,其长度为  %d",ss3,strlen(ss3)); 
				break; 
	} 
 
 
}