如何使tokinezer在使用strtok()时检测空空间 我正在设计一个C++程序,在程序中的某个地方,我需要检测是否有一个空白(空令牌)在令牌旁边,使用了已知的“”。 if(token1==start) { token2=strtok(NULL," "); if(token2==NULL) {LCCTR=0;} else {LCCTR=atoi(token2);}
因此,在前面的peice中,token1指向start,我想检查start旁边是否有一个成员,所以我使用如何使tokinezer在使用strtok()时检测空空间 我正在设计一个C++程序,在程序中的某个地方,我需要检测是否有一个空白(空令牌)在令牌旁边,使用了已知的“”。 if(token1==start) { token2=strtok(NULL," "); if(token2==NULL) {LCCTR=0;} else {LCCTR=atoi(token2);},c++,tokenize,strtok,C++,Tokenize,Strtok,因此,在前面的peice中,token1指向start,我想检查start旁边是否有一个成员,所以我使用token2=strtok(NULL,”)指向下一个标记,但不幸的是strtok函数无法检测到空空格,所以在运行时它给了我一个错误“无效的NULL指针”如何修复它,或者是否有其他函数用于检测空空间 #include <iostream> #include<string> #include<map> #include<iomanip>
token2=strtok(NULL,”)
指向下一个标记,但不幸的是strtok函数无法检测到空空格,所以在运行时它给了我一个错误“无效的NULL指针”如何修复它,或者是否有其他函数用于检测空空间
#include <iostream>
#include<string>
#include<map>
#include<iomanip>
#include<fstream>
#include<ctype.h>
using namespace std;
const int MAX=300;
int LCCTR;
int START(char* token1);
char* PASS1(char*token1);
void tokinizer()
{
ifstream in;
ofstream out;
char oneline[MAX];
in.open("infile.txt");
out.open("outfile.txt");
if(in.is_open())
{
char *token1;
in.getline(oneline,MAX);
token1 = strtok(oneline," \t");
START (token1);
//cout<<'\t';
while(token1!=NULL)
{
//PASS1(token1);
//cout<<token1<<" ";
token1=strtok(NULL," \t");
if(NULL==token1)
{//cout<<endl;
//cout<<LCCTR<<'\t';
in.getline(oneline,MAX);
token1 = strtok(oneline," \t");
}
}
}
in.close();
out.close();
}
int START(char* token1)
{
string start("START");
char*token2;
if(token1 != start)
{LCCTR=0;}
else if(token1==start)
{
token2=strchr(token1+2,' ');
cout<<token2;
if(token2==NULL)
{LCCTR=0;}
else
{LCCTR=atoi(token2);
if(atoi(token2)>9999||atoi(token2)<0){cout<<"IVALID STARTING ADDRESS"<<endl;exit(1);}
}
}
return LCCTR;
}
char* PASS1 (char*token1)
{
map<string,int> operations;
map<string,int>symtable;
map<string,int>::iterator it;
pair<map<string,int>::iterator,bool> ret;
char*token3=NULL;
char*token2=NULL;
string test;
string comp(" ");
string start("START");
string word("WORD");
string byte("BYTE");
string resb("RESB");
string resw("RESW");
string end("END");
operations["ADD"] = 18;
operations["AND"] = 40;
operations["COMP"] = 28;
operations["DIV"] = 24;
operations["J"] = 0X3c;
operations["JEQ"] =30;
operations["JGT"] =34;
operations["JLT"] =38;
operations["JSUB"] =48;
operations["LDA"] =00;
operations["LDCH"] =50;
operations["LDL"] =55;
operations["LDX"] =04;
operations["MUL"] =20;
operations["OR"] =44;
operations["RD"] =0xd8;
operations["RSUB"] =0x4c;
operations["STA"] =0x0c;
operations["STCH"] =54;
operations["STL"] =14;
operations["STSW"] =0xe8;
operations["STX"] =10;
operations["SUB"] =0x1c;
operations["TD"] =0xe0;
operations["TIX"] =0x2c;
operations["WD"] =0xdc;
if(operations.find("ADD")->first==token1)
{ token2=strtok(NULL," ");
//test=token2;
cout<<token2;
//if(test.empty()){cout<<"MISSING OPERAND"<<endl;exit(1);}
//else{LCCTR=LCCTR+3;}
}
/*else if(operations.find("AND")->first==token1)
{ token2=strtok(NULL," ");
test=token2;
if(test.empty()){cout<<"MISSING OPERAND"<<endl;exit(1);}
else{LCCTR=LCCTR+3;}
}
else if(operations.find("COMP")->first==token1)
{ token2=token1+5;
test=token2;
if(test.empty()){cout<<"MISSING OPERAND"<<endl;exit(1);}
else{LCCTR=LCCTR+3;}
}
else if(operations.find("DIV")->first==token1)
{ token2=token1+4;
test=token2;
if(test.empty()){cout<<"MISSING OPERAND"<<endl;exit(1);}
else{LCCTR=LCCTR+3;}
}
else if(operations.find("J")->first==token1)
{ token2=token1+2;
test=token2;
if(test.empty()){cout<<"MISSING OPERAND"<<endl;exit(1);}
else{LCCTR=LCCTR+3;}
}
else if(operations.find("JEQ")->first==token1)
{ token2=token1+5;
test=token2;
if(test.empty()){cout<<"MISSING OPERAND"<<endl;exit(1);}
else{LCCTR=LCCTR+3;}
}
else if(operations.find("JGT")->first==token1)
{ token2=strtok(NULL," ");
test=token2;
if(test.empty()){cout<<"MISSING OPERAND"<<endl;exit(1);}
else{LCCTR=LCCTR+3;}
}
else if(operations.find("JLT")->first==token1)
{ token2=token1+6;
test=token2;
if(test.empty()){cout<<"MISSING OPERAND"<<endl;exit(1);}
else{LCCTR=LCCTR+3;}
}
else if(operations.find("JSUB")->first==token1)
{ token2=token1+6;
test=token2;
if(test.empty()){cout<<"MISSING OPERAND"<<endl;exit(1);}
else{LCCTR=LCCTR+3;}
}
else if(operations.find("LDA")->first==token1)
{ token2=token1+6;
test=token2;
if(test.empty()){cout<<"MISSING OPERAND"<<endl;exit(1);}
else{LCCTR=LCCTR+3;}
}
else if(operations.find("LDCH")->first==token1)
{ token2=token1+6;
test=token2;
if(test.empty()){cout<<"MISSING OPERAND"<<endl;exit(1);}
else{LCCTR=LCCTR+3;}
}
else if(operations.find("LDL")->first==token1)
{ token2=token1+6;
test=token2;
if(test.empty()){cout<<"MISSING OPERAND"<<endl;exit(1);}
else{LCCTR=LCCTR+3;}
}
else if(operations.find("LDX")->first==token1)
{ token2=token1+6;
test=token2;
if(test.empty()){cout<<"MISSING OPERAND"<<endl;exit(1);}
else{LCCTR=LCCTR+3;}
}
else if(operations.find("MUL")->first==token1)
{ token2=token1+6;
test=token2;
if(test.empty()){cout<<"MISSING OPERAND"<<endl;exit(1);}
else{LCCTR=LCCTR+3;}
}
else if(operations.find("OR")->first==token1)
{ token2=token1+6;
test=token2;
if(test.empty()){cout<<"MISSING OPERAND"<<endl;exit(1);}
else{LCCTR=LCCTR+3;}
}
else if(operations.find("RD")->first==token1)
{ token2=token1+6;
test=token2;
if(test.empty()){cout<<"MISSING OPERAND"<<endl;exit(1);}
else{LCCTR=LCCTR+3;}
}
else if(operations.find("RSUB")->first==token1)
{ token2=token1+6;
test=token2;
if(test.empty()){cout<<"MISSING OPERAND"<<endl;exit(1);}
else{LCCTR=LCCTR+3;}
}
else if(operations.find("STA")->first==token1)
{ token2=token1+6;
test=token2;
if(test.empty()){cout<<"MISSING OPERAND"<<endl;exit(1);}
else{LCCTR=LCCTR+3;}
}
else if(operations.find("STCH")->first==token1)
{ token2=token1+6;
test=token2;
if(test.empty()){cout<<"MISSING OPERAND"<<endl;exit(1);}
else{LCCTR=LCCTR+3;}
}
else if(operations.find("STL")->first==token1)
{ token2=token1+6;
test=token2;
if(test.empty()){cout<<"MISSING OPERAND"<<endl;exit(1);}
else{LCCTR=LCCTR+3;}
}
else if(operations.find("STSW")->first==token1)
{ token2=token1+6;
test=token2;
if(test.empty()){cout<<"MISSING OPERAND"<<endl;exit(1);}
else{LCCTR=LCCTR+3;}
}
else if(operations.find("STX")->first==token1)
{ token2=token1+6;
test=token2;
if(test.empty()){cout<<"MISSING OPERAND"<<endl;exit(1);}
else{LCCTR=LCCTR+3;}
}
else if(operations.find("SUB")->first==token1)
{ token2=token1+6;
test=token2;
if(test.empty()){cout<<"MISSING OPERAND"<<endl;exit(1);}
else{LCCTR=LCCTR+3;}
}
else if(operations.find("TD")->first==token1)
{ token2=token1+6;
test=token2;
if(test.empty()){cout<<"MISSING OPERAND"<<endl;exit(1);}
else{LCCTR=LCCTR+3;}
}
else if(operations.find("TIX")->first==token1)
{ token2=token1+6;
test=token2;
if(test.empty()){cout<<"MISSING OPERAND"<<endl;exit(1);}
else{LCCTR=LCCTR+3;}
}
else if(operations.find("WD")->first==token1)
{ token2=token1+6;
test=token2;
if(test.empty()){cout<<"MISSING OPERAND"<<endl;exit(1);}
else{LCCTR=LCCTR+3;}
}*/
//else if(
if(word==token1)
{LCCTR=LCCTR+3;}
else if(byte==token1)
{string test;
token2=token1+7;
test=token2;
if(test[0]=='C')
{token3=token1+10;
test=token3;
if(test.length()>15)
{cout<<"ERROR"<<endl;
exit(1);}
}
else if(test[0]=='X')
{token3=token1+10;
test=token3;
if(test.length()>14)
{cout<<"ERROR"<<endl;
exit(1);}
}
LCCTR=LCCTR+test.length();
}
else if(resb==token1)
{token3=token1+5;
LCCTR=LCCTR+atoi(token3);}
else if(resw==token1)
{token3=token1+5;
LCCTR=LCCTR+3*atoi(token3);}
else if(end==token1)
{exit(1);}
/*else
{
test=token1;
int last=test.length();
if(token1==start||test[0]=='C'||test[0]=='X'||ispunct(test[last])||isdigit(test[0])||isdigit(test[1])||isdigit(test[2])||isdigit(test[3])){}
else {
token2=strtok(NULL," ");
//test=token2;
cout<<token2;
if(token2!=NULL)
{
symtable.insert( pair<string,int>(token1,LCCTR));
for(it=symtable.begin() ;it!=symtable.end() ;++it)
{/*cout<<"symbol: "<<it->first<<" LCCTR: "<<it->second<<endl;}
}
else{}
}
}*/
return token3;
}
int main()
{
tokinizer();
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
常数int MAX=300;
国际LCCTR;
int开始(字符*1);
char*PASS1(char*token1);
void-tokinizer()
{
如果输入;
流出的液体;
char-oneline[MAX];
in.open(“infle.txt”);
out.open(“outfile.txt”);
if(in.is_open())
{
字符*1;
in.getline(单行,最大值);
token1=strtok(单行“\t”);
启动(令牌1);
//看不到您的实际代码,很难说出确切的问题是什么。下面是一个一般性的答案
strtok
在内部是有状态的。您不能随意在NULL
上调用它
您可以有一个通行证来标记字符串并将返回的标记收集到数组或向量中。第一次调用start
,后续调用(直到strtok
返回NULL
)在NULL
上,您可以很容易地找出什么是什么。请向我们展示更多的代码。您正在将NULL传递给strtok-如果您想让它工作,您需要在之前使用非NULL指针调用它,但您的代码位不包括在内。可能重复的@Paul在@Shad的代码中复制的可能重复我是复信。