qwdqwefwf 2023-01-10 10:43 采纳率: 100%
浏览 42
已结题

词法分析器/C语言操作符判断错误,多个+

问题遇到的现象和发生背景

C语言程序对操作符判断错误

遇到的现象和发生背景,请写出第一个错误信息
#include <stdio.h>
#include <string.h>
#define boolean int
#define true 1;
#define false 0;

char ch=' ';
char temp[40];
char* keyword[32] ={"auto","break","caes","char","const","continue","default",
        "do","double","else","enum","extern","float","for","goto","if","int","long",
        "register","return","short","signed","sizeof","static","struct","switch",
        "typedef","union","unsiged","viod","volatile","while"};
//是否是关键词
boolean isKeyWord(char* temp){
    for(int j=0;j<32;j++){
        if(strcmp(temp,keyword[j])==0){
            return true;
        }
    }
    return false;
}
//是否是字母
boolean isLetter(char letter){  
    /*ascii码表中大小字母之前有其他的字符*/
    if((letter>='A'&&letter<='Z')||(letter>='a'&&letter<='z')){
        return true;
    } 
    else {
        return false;
    }
    
}

//是否是数字
boolean isDigit(char digit){
    if(digit>='0'&&digit<='9'){
        return true;
    }
    else{
        return false;
    }
}
//是否是引号
boolean isQuote(char quote){
    if(quote=='"'||quote=='\''){
        return true;
    }
    else{
        return false;
    }
}
//是否是分界符
boolean isBoundary(char boundary){
    switch (boundary)
    {
    case ',':
    case ';':
    case ':':
    case '{':
    case '}':
    case '[':
    case ']':
    case '(':
    case ')':
    case '#':
        {
            return true;
        }
    default:
        {
            return false;
        }
    }

}
//是否是操作符  存在一些占双字符或三字节的运算符
boolean isOperator(char operator){
    switch (operator)
    {
    case '+':
    case '-':
    case '*':
    case '/':
    case '%':
    case '>':
    case '<':
    case '=':
    case '&':
    case '|':
    case '!':
    case '?': 
       { return true;
    }
    default:
        return false;
    }
}
//是否是下划线
boolean isUnderline(char ul){
    if(ul=='_'){
        return true;
    }
    else{
        return false;
    }
}

void analyze(FILE* fp){
    while((ch=fgetc(fp))!=EOF){
        //读入tab,空字符,换行符等,什么也不做
        if(ch==' ')  { }
        if(ch=='\t'){ }
        if(ch=='\n'){ }

        //读入数字后,拼数
        else if(isDigit(ch)){
            char temp[40]={'\0'};
            int i=0;
            while(ch=='.'||isDigit(ch)){
            temp[i]=ch;
            i++;
            ch=fgetc(fp);
            }
            fseek(fp,-1L,SEEK_CUR);
            printf("字面量\t\t%s\n",temp);
        }
        //读入引号
        else if(isQuote(ch)){
            if(ch=='"'){
                char temp[40]={'\0'};
                int i=0;

                do{
                temp[i]=ch;
                i++;
                ch=fgetc(fp);
                }
                while(ch!='"');

                temp[i]=ch;

                printf("字面量\t\t%s\n",temp);
            }
            else if(ch=='\''){
                 if(ch=='\''){
                char temp[40]={'\0'};
                int i=0;

                do{
                temp[i]=ch;
                i++;
                ch=fgetc(fp);
                }
                while(ch!='\'');

                temp[i]=ch;

                printf("字面量\t\t%s\n",temp);
            }
            }
        }
        //读入字母
        else if(isLetter(ch)||isUnderline(ch)){
            char temp[40]={'\0'};
            int i=0;

            while(isLetter(ch)||isDigit(ch)||isUnderline(ch)){
            temp[i]=ch;
            i++;
            ch=fgetc(fp);
            }

            fseek(fp,-1L,SEEK_CUR);
            if(isKeyWord(temp)){
                printf("保留字\t\t%s\n",temp);
            }
            else  {
                printf("标识符\t\t%s\n",temp);
            }
            
        }
        
        else if(isBoundary(ch)){
                printf("分界符\t\t%c\n",ch);
        }

        else if(isOperator(ch)){
            char tmep[40]={'\0'};
            int i=0;
            while(isOperator(ch)){
                temp[i]=ch;
                i++;
                ch=fgetc(fp);
            }
            fseek(fp,-1L,SEEK_CUR);
            printf("操作数\t\t%s\n",temp);
        }
    }
}
void main(){
    FILE* fp;
    fp= fopen("D:/AB.txt","r");
    analyze(fp);
    fclose(fp);
    system("pause");
}

运行结果及详细报错内容

第一组

img


第二组

img

我的解答思路和尝试过的方法

不知道为什么第一组后面的操作符输出时会多+
请问可以从哪些角度分析呢?

  • 写回答

2条回答 默认 最新

  • 於黾 2023-01-10 11:11
    关注

    char tmep[40]={'\0'};
    这里变量名写错了
    导致后面用的其实是全局变量,而全局变量没有初始化
    尽量不要全局变量和局部变量同名,如果不同名编译就出错了,你就早发现这个bug了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月18日
  • 已采纳回答 1月10日
  • 修改了问题 1月10日
  • 创建了问题 1月10日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效