私は学校プロジェクトのためのコンパイラを書くことに取り組んでいます。この割り当てでは、テキストファイルのトークンをコンソールウィンドウに印刷するように求められています。私はそれを明確にしたいです私の宿題は私のために完了します。デバッグアサーションエラーの原因は何ですか?具体的には、私のコードで
私はこのファイルを反復処理し、charまたはc-stringの値(私の先生は彼の指示のこの部分をあいまいにしていました...)を連結して "token"という文字列変数に連結するこの愚かな関数を使っています" "main()"というファイルの最初の行を処理することはできますが、次の行にアクセスしようとすると2つのエラーのうちの1つが発生します。最初は、範囲外の文字列の下付き文字ですが、これは、存在しなかった文字列配列の一部にアクセスしようとしていたためだと思います。
Debug Assertion Failed Final.exe File:f:\dd\vctools\crt_bld\self_x86\crt\src\isctype.c Expression: (unsigned)(c+1) <= 256
私は私の機能とそれに関連するヘッダファイルが含まれている:私は取得しています最も普及エラーは、デバッグアサーションエラーです。関数呼び出し以外はmainで何も起こっていません。可能であれば、私が見ていないものを見ることができますか?私のコード体系は貧弱だと分かります。私はうそをつくことはありません(私は結局学校に通っています)。だから、コメント、批判、提案は大歓迎です。そしていつも、いつもありがとうございました。
.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
2行入力を提供できますか? – Arkadiy