为了账号安全,请及时绑定邮箱和手机立即绑定

如何处理形如这种的字符串:

如何处理形如这种的字符串:

C
斯蒂芬大帝 2023-03-04 17:13:57
-1 5:1 7:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1将它变为-1 1:0 2:0 3:0 4:0 5:1 ... 7:1 ... 14:1 ... 19:1 ... 39:1 40:1 ... 51:1 ... 63:1 ... 67:1 73:1 74:1 76:1 78:1 83:1就是把其中缺少的标号处补上x:0的形式用C语言实现,请问具体用到哪些函数,操作思路如何?详细回答者将继续追加高额悬赏分。谢谢各位帮忙
查看完整描述

2 回答

?
侃侃尔雅

TA贡献1801条经验 获得超15个赞

#include <stdio.h>

#include <string.h>

void main()

{

 int a,c,j,m,flag;

 char b;

 struct str

 {

  int a;

  char b;

  int c;

 }aa[100],bb[200];

 printf("请输入待处理数据,以输入65535完成输入!\n");

 scanf("%d",&aa[0].a);

 bb[0].a = aa[0].a;

 int i=1;

 do

 {

  scanf("%d%c%d",&a,&b,&c);

  if(a<0||a>65536||b!=':'||c<0||c>65535)

  {

   printf("ERROR INPUT!\n");

  }

  else

  {

   aa[i].a = a;

   aa[i].b = b;

   aa[i].c = c;

   ++i;

  }

  

 }

 while(aa[i-1].a!= 65535);

 m = 1;

 do

 {

  flag = 0;

  for(j=1;j<i-1;j++)

  {

   if(aa[j].a==m)

   {

    flag = 1;

    break;

   }

  }

  if(flag==1)

  {

   bb[m].a = aa[j].a;

   bb[m].b = aa[j].b;

   bb[m].c = aa[j].c;

  }

  else

  {

   bb[m].a = m;

   bb[m].b = ':';

   bb[m].c = 0;

  }

  m++;  

 }

 while(bb[m-1].a!= aa[i-2].a);

 printf("\n%d",bb[0],a);

 j=1;

 do

 {

  printf("\n%d%c%d",bb[j].a,bb[j].b,bb[j].c);

  j++;

 }

 while(j<m);

 printf("\n");

 

}

查看完整回答
反对 回复 2023-03-08
?
月关宝盒

TA贡献1772条经验 获得超5个赞

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
typedef struct node{ //这个数据结构用于存储单个比例表达式
int bf;//存储比的前项,也就是冒号之前的数字
int af;//存储比的后项,也就是冒号之后的数字
struct node *next;//指向下一个比
} node;
typedef struct{//这个单链表结构用于存储所有的比
node *first;//指向第一个比例项
node *last;//指向最后一个比例项
int cnt;//比例项的个数
} list;
list *init(void)//初始化单链表
{
list *st=malloc(sizeof(list));
if (st==NULL) exit(-1);
else st->cnt=0;

return st;
}
void push_back(list *l,int bf,int af)//在单链表l的末尾插入由bf和af作为比的前后项的比例式
{
node *tm=malloc(sizeof(node));
if (tm==NULL) exit(-1);
tm->af=af;
tm->bf=bf;
tm->next=NULL;
if (l->cnt)
{
l->last->next=tm;
l->last=tm;
}
else
{
l->first=l->last=tm;
}
l->cnt++;
}
void add(list *l,int tbf)//把以l表中最后一项的比例前项+1到tbf-1这些整数做为比例前项,0做为比例后项的比例式插入到l表中
{
int i,fbf;
node *tm;
for (i=l->last->bf+1;i<tbf;i++)
push_back(l,i,0);
}
size_t num_len(const int a)//辅助函数,返回整数a的字符长度
{
char str[80];
sprintf(str,"%d",a);
return strlen(str);
}
char *toStr(list *l)//将l链表中的内容转化为可输出的字符串
{
char *str=malloc(sizeof(char)*3);
int bn=2;
node *t=NULL;
if (str==NULL) exit;
strcpy(str,"-1");
for (t=l->first;t!=NULL;t=t->next)
{
str=realloc(str,sizeof(char)*(bn+num_len(t->af)+num_len(t->bf)+2));
if (str==NULL) exit(-1);
sprintf(str+bn," %d:%d\0",t->bf,t->af);
bn=strlen(str);
}
return str;
}
void FREE(list *a)//释放单链表a占用的空间
{
node *c,*b;
for (b=a->first;b!=NULL;b=c)
{
c=b->next;
free(b);
}
free(a);
}
int main(void)
{
char *chstr,cnstr[]="-1 5:1 7:1 14:1 19:1 39:1 40:1 51:1 63:1 67:1 73:1 74:1 76:1 78:1 83:1";
list *slist=init();
int inbf,inaf,len=0;
while (cnstr[len])//当cnstr字符串中还有字符未读取时继续
{
while(isspace(cnstr[len])) ++len;//跳过空格字符
sscanf(cnstr+len,"%d",&inbf);//从cnstr[len]字符开始读取一个整数(比的前项)
len+=num_len(inbf);//将刚才读取的整数的字符长度累加到len上以 确定下次sscanf()读取时的位置
//len+=sscanf(cnstr+len,"%d",&inbf);
if (inbf==-1)//如果读取到的是第一项(即读取到-1)就把1:0存入slist单链表
push_back(slist,1,0);
else//如果读取到的不是第一项(即inbf不是-1)
{
add(slist,inbf);//将表slist中的当面末项到inbf之间缺少的项添加到表slist中
while(!isdigit(cnstr[len])) ++len;//路过非数字字符,以便于后面读取比的后项
sscanf(cnstr+len,"%d",&inaf),inaf;//读取比的后项。
len+=num_len(inaf);//将刚才读取的整数inaf的字符长度累加到len上以确定下次sscanf()读取时的位置
push_back(slist,inbf,inaf);//将cnstr字符串中的当前比式加入到表slist中
}
}
puts(chstr=toStr(slist));//将处理完成的slist表转换为可输出的字符串,并输出
FREE(slist);//释放slist占用的空间
free(chstr);//释放转换后的字符串占用的空间。
return 0;
}


查看完整回答
反对 回复 2023-03-08
  • 2 回答
  • 0 关注
  • 75 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信