user-0 提问: 用C语言实现将一个字符中所有出现的数字前后加上符号“*”，其他字符保持不变

回复:
user: user-1
content: 跟着六楼走  bison   yacc  好像可以做的更多 （抱歉 我没有用过，听说过）

user: user-2
content: //纯C void    ChangeStr(char *str) {         char *A;         char *B; 		char C;         if(NULL==str) return;         A=str;         B=str;         while(*B)         {             if((*B<=0x39)&&(*B>=0x30))              {                  if(*A!='*') *A='*'; 				 B++;             } 			else  			{ 				if(*A=='*') A++; 				*A=*B; 				A++; 				B++; 			}         }         while(*A)         {             *A='\0';             A++;         } }  //应用举例 int main() {         char buf[30]="Jkdi234klowe90a3"        ChangeStr(buf)         puts(buf);           return 0; } //结果:Jkdi*klowe*a*

user: user-3
content: 忘了贴这个函数了，也可以用系统的那个判断数字字符的函数 bool IsDigital(char c) { 	if ( c >= '0' && c <= '9')	 	{ 		return true; 	} 	return false; }

user: user-3
content: 仅供参考 void InsertAsterisk(const char * str ,char *pNew ) { 	const char *pStr = str; 	char *pNewTmp = pNew; 	while (*pStr) 	{ 		if ((IsDigital(*pStr) && !IsDigital(*(pNewTmp-1))) || 			(!IsDigital(*pStr) && IsDigital(*(pNewTmp-1))))		// 状态改变时就插入'*'号 		{ 			*pNewTmp++ = '*'; 		} 		*pNewTmp++ = *pStr++; 	} 	if (IsDigital(*(pNewTmp-1)))		// 处理末尾是数字字符的情况 	{ 		*pNewTmp++ = '*'; 	} 	*pNewTmp = 0;		// 加上结束符 }  int main() { 	char str[20] = "fds43d435f"; 	char strNew[40] = {0};			// 新串长度要足够插入所有*号 	InsertAsterisk(str ,strNew); 	return 0; }

user: user-4
content: #10 按顺序进来字符 问 是数字吗？  不是，直接输出                                                          是，输出*和数字 ，继续循环问是数字吗？是输出，不是就输出*，回到开头。

user: user-5

user: user-6
content: 分配一块新的内存，比原来字符中长度要大，然后一个一个拷贝进去，拷的过程中判断是否要加*

user: user-7
content: 仅供参考！#include<stdio.h>  void insertmark(char* source,char* result){ 	char* p = source, *q = result; 	int num = 0;   //用来判断是否正在读取数字 	while (*p != '\0'){ 		if (num==0&&*p <= '9'&&*p >= '0'){ 			*(q++) = '*'; 			num = 1; 		} 		else if (num == 1 && (*p > '9' || *p < '0')){ 			*(q++) = '*'; 			num = 0; 		} 		*(q++) = *(p++); 	} 	if (num == 1) 		*(q++) = '*'; 	*q = '\0'; }  int main(){ 	char str[] = "12abcd321s2defg01fsd3"; 	char result[50]; 	insertmark(str, result); 	puts(result); }

user: user-4
content: #include<stdio.h> main() {   char a[100],*p;   scanf("%s",a);   p=a;   while(*p!='\0')     {       if(*p<=45 || *p>=57) 	 printf("%c",*p++);       else        { 	 printf("*%c",*p++); 	 while(*p>=48 && *p<=57) 	   printf("%c",*p++); 	   printf("*");        }     } }

user: user-3
content: 是给每个数字字符前后加还是给连续的数字字符前后加，给个输入和输出样例看看。加字符这种操作比较危险，需要保证字符数组空间足够容纳要加入的新字符。

user: user-4
content: #include<stdio.h> main() {    char a[100];    char *p;    scanf("%s",a);    p=a;     while(*p!='\0')      if(*p>=48 && *p<=57 )        { 	 printf("*%c",*p++); 	 while(*p>=48 && *p<=57) 	  { 	   printf("%c",*p++ ) ; 	  } 	printf("*");        }      else       { 	printf("%c",*p++);       } }

user: user-8
content: #6正解，顶

user: user-8
content: 仅供参考 #include<stdio.h> #include<stdlib.h> #include<string.h>  void insertMark(char *buffer,char *target) { 		char *p; 		//1表示当前字符是数字，0则表示非数字 		int state = 0; 		int i; 		p = target; 		for(i = 0; *p != '\0'; ++p) 		{ 				//如果是一串数字的开始,则在串前面加* 				if(state == 0 && *p >= '0' && *p <= '9') 				{ 						//状态转移 						state = 1; 						buffer[i++] = '*'; 						buffer[i++] = *p; 				} 				//如果是是一串数字结尾,则在结尾处加*,例如11211d，则12211* 				else	if(state == 1 && (*p < '0' || *p > '9')) 				{ 						//状态转移 						state = 0; 						buffer[i++] = '*'; 						buffer[i++] = *p; 				} 				//如果是一串非数字,则直接写入buffer，例如12，则写入12 				else if(state == 0 && (*p < '0' || *p > '9')) 				{ 						buffer[i++] = *p; 				} 				//如果当前是一串数字，则写入buffer 				else if(state == 1 && *p >= '0' && *p <= '9') 				{ 						buffer[i++] = *p; 				} 		} 		buffer[i] = '\0'; }  int main() { 		char str[30]; 		char buffer[100]; 		fgets(str,sizeof(str),stdin); 		insertMark(buffer,str); 		puts(buffer);  		exit(0); }

user: user-9
content: 1  申请一个2倍大的空间 2  把字符一个一个的比较看是否为数字，不是就直接拷贝，是就先来个*再拷贝（根据你上面的只是在数字两侧加*，可以设置一个bool变量来决定是否在前面加*）

user: user-10
content: 参考《编译原理》中的词法分析和有限状态自动机。

user: user-0
content: 引用 1 楼 starytx 的回复:是给每个数字字符前后加还是给连续的数字字符前后加，给个输入和输出样例看看。加字符这种操作比较危险，需要保证字符数组空间足够容纳要加入的新字符。  连续的数字字符前后加 输入：Jkdi234klowe90a3 输出：Jkdi*234*klowe*90*a*3*