我正在編寫一個學校項目的編譯器,這個任務要求我打印文本文件的標記到控制檯窗口。我想說清楚我不要想爲我完成我的功課。什麼會導致調試斷言錯誤。具體來說,在我的代碼
我一直在處理這個迭代遍歷文件的愚蠢函數,並將一個char或c-string值(我的導師在他的這部分指令中含糊不清......)連接到一個名爲「token 「。我可以通過罰款的第一行,這是「main()」,但是當我嘗試訪問下一行時,我得到兩個錯誤中的一個。第一種是字符串下標超出範圍錯誤,但我認爲這是因爲我試圖訪問不存在的字符串數組的一部分。最普遍的錯誤我得到的是一個調試斷言錯誤:
Debug Assertion Failed Final.exe File:f:\dd\vctools\crt_bld\self_x86\crt\src\isctype.c Expression: (unsigned)(c+1) <= 256
我已經包括了我的功能和其相關的頭文件。除了函數調用之外,沒有任何事情正在進行。如果可能的話,你能否看到我無法看到的東西。我意識到我的代碼結構很差,我不會撒謊(畢竟我在學校)。所以,任何評論,批評和建議都非常受歡迎。並且總是,任何時候都感謝你。
.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
我的建議是學會使用調試器。在你的函數中設置一個斷點並通過它進行調試,以確切查看導致錯誤的原因。 – Chad
這條線是幹什麼的? if(c =='{'|| c =='}'|| c =='+'|| c =='='|| myLine [pos] =='('|| c ==') '|| c ==';')。 – kmdent
你能提供你的雙線輸入嗎? – Arkadiy