亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何處理形如這種的字符串:

如何處理形如這種的字符串:

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條經驗 獲得超16個贊

#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 關注
  • 133 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號