感谢大佬666 2022-10-06 09:29 采纳率: 83%
浏览 109
已结题

c语言有点难,有点难

还需要实现dtb函数(将字符数组格式的十进制转换成字符数组格式的二进制)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define _KEY_WORD_END "waiting for your expanding"
typedef struct{
    int typenum;
    char * word;
}WORD;
char input[255];
char token[255]="";
int p_input;
int p_token;
char ch;
char * rwtab[]={"begin","if","then","while","do","end",_KEY_WORD_END};
WORD *scaner();
int main(){
    int over=1;
    WORD* oneword=new WORD;
    printf("Enter Your words (end with #):");
    scanf("%[^#]s",input);
    p_input=0;
    printf("Your words:\n%s\n",input);
    while(over<1000&&over!=-1){
        oneword=scaner();
        if(oneword->typenum<1000)
        printf("(%d,%s)",oneword->typenum,oneword->word);
        over =oneword->typenum;
    }
    printf("\npress # to exit:");
    scanf("%[^#]s",input);
}
char m_getch(){
    ch=input[p_input];
    p_input=p_input+1;
    return(ch);
}
void getbc(){
    while(ch==' '||ch==10){
        ch=input[p_input];
        p_input=p_input+1;
    }
}
void concat(){
    token[p_token]=ch;
    p_token=p_token+1;
    token[p_token]='\0';
}
int letter(){
    if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')return 1;
    else return 0;
}
int digit(){
    if(ch>='0'&&ch<='9')return 1;
    else return 0;
}
int reserve(){
    int i=0;
    while(strcmp(rwtab[i],_KEY_WORD_END)){
        if(!strcmp(rwtab[i],token)){
            return i+1;
        }
        i=i+1;
    }
    return 10;
}
void retract(){
        p_input=p_input-1;
}
char *dtb(){
    return NULL;
}
WORD *scaner(){
        WORD* myword=new WORD;
        myword->typenum=10;
        myword->word="";
        p_token=0;
        m_getch();
        getbc();
        if(letter()){
            while(letter()||digit()){
                concat();
                m_getch();
            }
            retract();
                myword->typenum=reserve();
                myword->word=token;
                return(myword);
        } else if(digit()){
            while(digit()){
                concat();
                m_getch();
            }
                retract();
                myword->typenum=20;
                myword->word=token;
                return(myword);
        }else switch(ch){
            case '=': m_getch();
            if(ch=='='){
                myword->typenum=39;
                myword->word="==";
                return(myword);
            }
                retract();
                myword->typenum=21;
                myword->word="=";
                return(myword);
                break;
            case '+':    myword->typenum=22;
                        myword->word="+";
                        return(myword);
                break;
            case '-':    myword->typenum=23;
                        myword->word="-";
                        return(myword);
                break;
            case '*':    myword->typenum=24;
                        myword->word="*";
                        return(myword);
                break;
            case '/':    myword->typenum=25;
                        myword->word="/";
                        return(myword);
                break;
            case '(':    myword->typenum=26;
                        myword->word="(";
                        return(myword);
                break;
            case ')':    myword->typenum=27;
                        myword->word=")";
                        return(myword);
                break;
            case '[':    myword->typenum=28;
                        myword->word="[";
                        return(myword);
                break;
            case ']':    myword->typenum=29;
                        myword->word="]";
                        return(myword);
                break;
            case '{':    myword->typenum=30;
                        myword->word="{";
                        return(myword);
                break;
            case '}':    myword->typenum=31;
                        myword->word="}";
                        return(myword);
                break;
            case ',':    myword->typenum=32;
                        myword->word=",";
                        return(myword);
                break;
            case ':':    myword->typenum=33;
                        myword->word=":";
                        return(myword);
                break;
            case ';':    myword->typenum=34;
                        myword->word=";";
                        return(myword);
                break;
            case '>': m_getch();
            if(ch=='='){
                    myword->typenum=37;
                        myword->word=">=";
                        return(myword);
            }
                retract();
                myword->typenum=35;
                myword->word=">";
                return(myword);
                break;
            case '<': m_getch();
            if(ch=='='){
                    myword->typenum=38;
                        myword->word="<="</span>;
                        <span class="hljs-keyword">return(myword);
            }
                retract();
                myword->typenum=36;
                myword->word="<";
                return(myword);
                break;    
            case '!': m_getch();
            if(ch=='='){
                    myword->typenum=40;
                        myword->word="!=";
                        return(myword);
            }
                retract();
                myword->typenum=-1;
                myword->word="ERROR";
                return(myword);
                break;
            case '\0': myword->typenum=1000;
                        myword->word="OVER";
                        return(myword);
            break;
            default: 
                myword->typenum=-1;
                myword->word="ERROR";
                return(myword);
            
                
        }
}




































测试数据

img

  • 写回答

4条回答 默认 最新

  • qzjhjxj 2022-10-09 14:09
    关注

    写了个dtob()函数和示例,供参考:

    char* dtob(int n, char* bstr)
    {
        if (n >= 2)
            bstr = dtob(n / 2, bstr);
        *bstr++ = n % 2 + '0';
        *bstr = '\0';
        return  bstr;
    }
    int main()
    {
        char b[16], * s;
        int  n;
        scanf("%d", &n);
        dtob(n, b);
        s = b;
        printf("s:%s,  b:%s", s, b);
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 10月17日
  • 已采纳回答 10月9日
  • 创建了问题 10月6日

悬赏问题

  • ¥15 matlab中使用gurobi时报错
  • ¥15 WPF 大屏看板表格背景图片设置
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂