直奔主题
#include"stdio.h"
#include"string"
void HDB3(char *input_zifu)
{
char output_shuzi[50]={0};
int i,flag0=0,flag1=0;
int lastV=-1,last_shuzi=-1;
for(i=0;input_zifu[i]!='\0';i++)
{
if(input_zifu[i]=='0')//如果本位为0
{
++flag0;//记录出现0的个数
if(flag0==4)//连续出现4个0,第四个0必改V
{
flag0=0;//对0的计数重新开始
lastV*=-1;//每出现4个0必有V且极性交替
//lastV=1 ? output_shuzi[i]=2 : output_shuzi[i]=-2;//V先用数字2代替,正负交替
output_shuzi[i]=(lastV==1) ? 2:-2;//V先用数字2代替,正负交替
//if(lastV==1) output_shuzi[i]=2;
//if(lastV==-1) output_shuzi[i]=-2;
if(lastV!=last_shuzi)//如果V与前一个数字符号不同,则第一个0变B
{
//last_shuzi=1 ? output_shuzi[i-3]=-3 : output_shuzi[i-3]=3;
output_shuzi[i-3]=(last_shuzi==1) ? -3:3;//B先用数字3代替,与前一个数字符号相反
//if(last_shuzi==1) output_shuzi[i-3]=-3;
//if(last_shuzi==-1) output_shuzi[i-3]=3;
}
last_shuzi=lastV;//出现V后,正负号从V开始重新交替
}
else
{
output_shuzi[i]=9;//因为不定长数组内出现数字0后无法得知数组长度,所以用9代替0
}
}
else//如果本位是1
{
flag0=0;//0的个数清零,重新记录
last_shuzi*=-1; output_shuzi[i]=last_shuzi;//第一个1从+1开始交替
}
}
printf("HDB3码为:\n");
for(i=0;output_shuzi[i]!=0;i++)
{
switch(output_shuzi[i])//将转换后数组内容以HDB3码的形式输出
{
case 9:printf("0"); break;
case -1:printf("-1");break;
case 1:printf("+1");break;
case -2:printf("-V");break;
case 2:printf("+V");break;
case -3:printf("-B");break;
case 3:printf("+B");break;
}
}
printf("\n");
}
int main(void)
{
char IN_ZIFU[50]={0};
while(1)
{
printf("请输入消息码:\n");
scanf("%s",IN_ZIFU);
HDB3(IN_ZIFU);
}
//printf("%d\n",(int)IN_ZIFU[0]-48);//字符转数字-48
return 0;
}