⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gc_8_10.c

📁 gc:高级程序员考试用书的c程序源文件
💻 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 <stdio.h>
# include <string.h>
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;
	}


}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -