【发布时间】:2011-10-03 21:22:00
【问题描述】:
我正在为一个学校项目编写一个编译器,这个任务要求我将一个文本文件的标记打印到控制台窗口。我想明确表示我不希望为我完成作业。
我一直在使用这个愚蠢的函数,它遍历文件,并将一个 char 或一个 c 字符串值(我的导师在他的这部分说明上含糊不清......)连接到一个名为“token. "我可以很好地完成文件的第一行,即“main()”,但是当我尝试访问下一行时,我得到了两个错误之一。第一个是字符串下标超出范围错误,尽管我认为这是因为我试图访问不存在的字符串数组的一部分。我遇到的最普遍错误是调试断言错误:
调试断言失败 Final.exe 文件:f:\dd\vctools\crt_bld\self_x86\crt\src\isctype.c 表达式: (无符号)(c+1)
我已经包含了我的函数及其相关的头文件。除了函数调用之外,main 中什么都没有发生。如果可能的话,你能看到我看不到的东西吗?我意识到我的代码结构很差,我不会撒谎(毕竟我在学校)。因此,非常欢迎任何 cmets、批评和建议。永远,谢谢你。
.CPP 文件(现在的样子)
#include <iostream>
#include <string>
using namespace std;
void tokenWork::openFile()
{
fileName = "test.txt";
source.open(fileName);
if(!source.is_open())
{
cout << "Cannot find file " << endl;
}
}
void tokenWork::traveseLine()
{
pos = 0;
while (!source.eof())
{
getline(source,myLine);
int length = myLine.length();
letters = new char[length];
myLine.copy(letters,length);
c = letters[pos];
if (isalpha(c))
token = token + myLine[pos];
else if (isdigit(c))
token = token + letters;
else
{
cout << token << endl;
token = "";
}
if (c == '{' || c == '}' || c == '+' || c == '=' || myLine[pos] == '(' || c == ')' || c == ';')
cout << myLine[pos] << endl;
c = letters[pos++];
}
}
.h 文件
#ifndef H_LEX
#define H_LEX
#include <string>
#include <iostream>
#include <fstream>
using namespace std;
class tokenWork
{
public:
std::string fileName;
std::string myLine;
std::string token;
int pos;
int length;
int c;
char *letters;
ifstream source;
void openFile();
void traveseLine();
void closeFile();
};
#endif
【问题讨论】:
-
我的建议是学习使用调试器。在您的函数中设置断点并通过它进行调试,以查看导致错误的确切原因。
-
这条线在做什么? if (c == '{' || c == '}' || c == '+' || c == '=' || myLine[pos] == '(' || c == ') ' || c == ';').
-
你能提供你的两行输入吗?
-
请忽略此帖。感谢所有看过它的人!