VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 393|回复: 3

[求助] 关于条件语句判断字符数组的错误

[复制链接]
83_avatar_middle
在线会员 发表于 2019-6-8 16:15:28 | 显示全部楼层 |阅读模式
3驿站币
// Project1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <stdio.h>
#include "pch.h"
#include <iostream>
using  namespace std;
bool F[125][125];//用于记录P的firstvt
bool L[125][125];//用于记录P的lastvt
static char Producer[20][20];//用于存放产生式

void Cre_Firstvt(char P,int a);//创建终结符的Firstvt
void Cre_Lastvt(char P, int a);//创建终结符的Lastvt

bool IsBLetters(char a)//非大写字母
{
        if (a >= 65 && a <= 90)
                return true;
        return false;
}

bool IsTerminator(char ch)//终结符
{
        if (ch>=97&&ch<=122||ch=='{'||ch=='='||ch=='}'||ch=='+'||ch=='*'||ch=='/'||ch=='-'||ch=='<'||ch=='>'||ch=='?')
        {
                return true;
        }
        return false;
}
void Cre_Firstvt(char P,int a)//构造非终结符的Firstvt P为要构造的非终结符 a为第a+1条产生式
{
       
        int i;
        char Non_Terminator;
        Non_Terminator = Producer[a][0];
        for (i = 4; i < 20; i++)
        {
                if ((Producer[a][i - 2] == '|'&&IsBLetters(Producer[a][i - 1]) == 1 && IsTerminator(Producer[a][i]) == 1) || (IsBLetters(Producer[a][i - 1]) == 1 && i == 5 && IsTerminator(Producer[a][i]) == 1))//型如Pa...
                {
                        F[Non_Terminator][Producer[a][i]] = 1;
                }
                else if ((i == 4 && IsTerminator(Producer[a][i]) == 1) || (Producer[a][i - 1] == '|'&&IsTerminator(Producer[a][i]) == 1))//型如a...
                {
                        F[Non_Terminator][Producer[a][i]] = 1;
                }
                else if ((Producer[a][i - 1] == '|'&&IsBLetters(Producer[a][i]) == 1&&Producer[a][i+1]=='|') || (i == 4 && IsBLetters(Producer[a][i]) == 1 && Producer[a][i + 1] == '|') || (Producer[a][i - 1] == '|'&&IsBLetters(Producer[a][i]) == 1 /*&& Producer[a][i + 1] == '\n'*/))//型如 |E|  E| |E
                {
                        for (int m = 0; m < 20; m++)//递归产生式 回填Firstvt
                        {
                                if (Producer[m][0] == Producer[a][i])
                                {
                                        Cre_Firstvt(Producer[m][0], m);
                                }
                        }
                        for (int j = 0; j < 125; j++)
                        {
                                if (F[Producer[a][i]][j] == 1)
                                {
                                        F[Non_Terminator][j] = 1;
                                }
                        }
                }
        }
}

void Cre_Lastvt(char P, int a)//创建终结符的Lastvt
{
        int i;
        char Non_Terminator;
        Non_Terminator = Producer[a][0];
        for (i = 4; i < 20; i++)
        {
                if ((IsTerminator(Producer[a][i])==1&&IsBLetters(Producer[a][i+1])==1&&Producer[a][i+2]=='|')||(IsTerminator(Producer[a][i]) == 1 && IsBLetters(Producer[a][i + 1]) == 1 && Producer[a][i + 2] == '\n'))//形如...aP
                {
                        L[Non_Terminator][Producer[a][i]] = 1;
                }
                else if ((IsTerminator(Producer[a][i]) == 1 && Producer[a][i + 1] == '|') || (IsTerminator(Producer[a][i]) == 1 && Producer[a][i + 1] == '\n'))//形如....a
                {
                        L[Non_Terminator][Producer[a][i]] = 1;
                }
                else if((Producer[a][i - 1] == '|'&&Producer[i][i + 1] == '|'&&IsBLetters(Producer[a][i]) == 1) || (i == 4 && IsBLetters(Producer[a][i]) == 1 && Producer[a][i + 1] == '|') || (Producer[a][i - 1] == '|'&&IsBLetters(Producer[a][i]) == 1 && Producer[a][i + 1] == '\n'))//形如 |E|  E| |E
                {
                        for (int m = 0; m < 20; m++)//递归产生式 回填Lirstvt
                        {
                                if (Producer[m][0] == Producer[a][i])
                                {
                                        Cre_Lastvt(Producer[m][0], m);
                                }
                        }
                        for (int j = 0; j < 125; j++)
                        {
                                if (L[Producer[a][i]][j] == 1)
                                {
                                        L[Non_Terminator][j] = 1;
                                }
                        }
                }
        }
}
int main()
{
        int i, j;
        char temp[20] = {'\0'};
        for (i = 0; i < 125; i++)
        {
                for (j = 0; j < 125; j++)
                {
                        F[i][j] = false;
                }
        }
        for (i = 0; i < 125; i++)
        {
                for (j = 0; j < 125; j++)
                {
                        L[i][j] = false;
                }
        }
        printf("请输入产生式,两次回车结束输入\n");
        for (i = 0; i < 20; i++)
        {
                for (j = 0; j < 20; j++)
                {
                        scanf("%c", &Producer[i][j]);
                        if (Producer[i][j] == '\n')//遇到回车
                        {
                                break;
                        }
                }
                if (Producer[i][0] == '\n')//再次遇到回车 输入结束
                        break;
        }
        i = 0;
        while (Producer[i][0] != '\n')
        {
                Cre_Firstvt(Producer[i][0], i);
                i++;
        }
        for (i = 0; i < 125; i++)
        {
                for (j = 0; j < 125; j++)
                {
                        if (F[i][j] == true)
                                printf("%c的Firstvt: %c\n", i, j);
                }
        }
        printf("\n");
        i = 0;
        while (Producer[i][0] != '\n')
        {
                Cre_Lastvt(Producer[i][0], i);
                i++;
        }
        for (i = 0; i < 125; i++)
        {
                for (j = 0; j < 125; j++)
                {
                        if (L[i][j] == true)
                                printf("%c的Lastvt: %c\n", i, j);
                }
        }
        printf("\n");
       
}




在Firstvt 函数里最后一个判断语句如果判断Producer[a][i-1]== '|'  &&producer[a][i]  为大写字母 如果后面不加上 && Producer[a][i+1] == '\n' 就报错 这个是什么原因怎么改呢?  

报错图片

报错图片




上一篇:windows 编译MySql connector c++ 8.0
下一篇:请问下这两个项目怎么编译?
83_avatar_middle
ico_lz  楼主| 发表于 2019-6-8 16:16:36 | 显示全部楼层
S-->v=E|E?|l E-->E+T|E-T|T T-->T*F|T/F|F F--><E>|v|c 这是我输入的产生式
75_avatar_middle
在线会员 发表于 2019-6-9 15:35:09 | 显示全部楼层
弹出那个框框,一般就只有一种情况就内存操作导致错误。
检查代码,循环中Producer[a][i+1] 都有可能内存异常。
有两种解决办法:
1、把static char Producer[20][20];下标设大一点,就不会出错了。
2、数组都加上越界检查。
特别是还有输入,更不能保证按键完全合法。
具体到哪一步,可以开启调试,单步执行,就能查到。
断点设在     for (i = 4; i < 20; i++)
每走一步看i值,看到哪异常。


关于条件语句判断字符数组的错误
83_avatar_middle
ico_lz  楼主| 发表于 2019-6-10 14:03:56 | 显示全部楼层
xx_player 发表于 2019-6-9 15:35
弹出那个框框,一般就只有一种情况就内存操作导致错误。
检查代码,循环中Producer[a] 都有可能内存异常。
...

哈哈哈 谢谢  最后发现是递归时没考虑清情况造成了死循环 单步调试真是好方法  问题解决了           敢问那个结贴在哪?我一直没找到关于条件语句判断字符数组的错误
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-9-21 07:44

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表