C++ 中的 isalpha 对于单个整数不能正常工作

isalpha in c++ not working correctly for single integer

我编写了一个代码,使用 stl(向量)将 nfa 转换为 dfa。 在此代码中,isalpha() 不起作用。 isalpha 下面的 if 块 不做任何事情。 如果我输入一个字母表,它会在其下方打印所有 cout 我尝试使用

if(isaplha(n){
cout<<"Incorrect";
return 0;
}

还是不行 如果您能提出任何建议,那就太好了。另外,如果您觉得代码需要任何改进,请告诉

#include<ctype.h>
#include<bits/stdc++.h>
using namespace std;
void print(vector<vector<vector<int> > > table){
    cout<<setw(10)<<"STATE/INPUT";
    char a='a';
    for(int i=0;i<table[0].size()-1;i++){
        cout<<setw(10)<<a++<<setw(10);
    }
    cout<<"^"<<endl<<endl;
    for(int i=0;i<50;i++)
        cout<<"-";
        cout<<endl;
    for(int i=0;i<table.size();i++){
        cout<<setw(10)<<i;
        for(int j=0;j<table[i].size();j++){
            cout<<setw(10);
            for(int k=0;k<table[i][j].size();k++){
                cout<<table[i][j][k]<<" ";
            }
        }
        cout<<endl;
    }
}
void printdfa(vector<vector<int> > states, vector<vector<vector<int> > > dfa){
    cout<<"  STATE/INPUT  ";
    char a='a';
    for(int i=0;i<dfa[0].size();i++){
        cout<<setw(11)<<a++<<setw(10);
    }
    cout<<endl<<endl;
    for(int i=0;i<50;i++)
        cout<<"-";
        cout<<endl;
    cout<<endl;
    for(int i=0;i<states.size();i++){
        cout<<setw(11)<<"{ ";
        for(int h=0;h<states[i].size();h++)
            cout<<states[i][h];
        if(states[i].empty()){
            cout<<"^";
        }
        cout<<" }";
        for(int j=0;j<dfa[i].size();j++){
            cout<<setw(11);
            for(int k=0;k<dfa[i][j].size();k++){
                cout<<dfa[i][j][k]<<" ";
            }
            if(dfa[i][j].empty()){
                cout<<"^";
            }
        }
        cout<<endl;
    }
}
vector<int> closure(int s,vector<vector<vector<int> > > v){
    vector<int> t;
    queue<int> q;
    t.push_back(s);
    int a=v[s][v[s].size()-1].size();
    for(int i=0;i<a;i++){
        t.push_back(v[s][v[s].size()-1][i]);
        q.push(t[i]);
    }
    while(!q.empty()){
        int f=q.front();
        q.pop();
        if(!v[f][v[f].size()-1].empty()){
            int u=v[f][v[f].size()-1].size();
            for(int i=0;i<u;i++){
                int y=v[f][v[f].size()-1][i];
                if(find(t.begin(),t.end(),y)==t.end()){
                    t.push_back(y);
                    q.push(y);
                }
            }
        }
    }
    return t;
}
int main(){
    int n,alpha;
    cout<<"************************* NFA to DFA *************************"<<endl<<endl;
    cout<<"Enter total number of states in NFA : ";
    cin>>n;
    if(isalpha(n) != 0){
        cout<<"Incorrect";
        return 0;
    }
    cout<<"Enter number of elements in alphabet : ";
    cin>>alpha;
    if(isalpha(alpha) != 0){
        cout<<"Incorrect";
        return 0;
    }
    vector<vector<vector<int> > > table;
    for(int i=0;i<n;i++){
        cout<<"For state "<<i<<endl;
        vector< vector< int > > v;
        char a='a';
        int y,yn;
        for(int j=0;j<alpha;j++){
            vector<int> t;
            cout<<"Enter no. of output states for input "<<a++<<" : ";
            cin>>yn;
            cout<<"Enter output states :"<<endl;
            for(int k=0;k<yn;k++){
                cin>>y;
                t.push_back(y);
            }
            v.push_back(t);
        }
        vector<int> t;
        cout<<"Enter no. of output states for input ^ : ";
        cin>>yn;
        cout<<"Enter output states :"<<endl;
        for(int k=0;k<yn;k++){
            cin>>y;
            t.push_back(y);
        }
        v.push_back(t);
        table.push_back(v);
    }
    cout<<endl<<endl<<"***** TRANSITION TABLE OF NFA *****"<<endl<<endl;
    print(table);
    cout<<endl<<endl<<endl<<"***** TRANSITION TABLE OF DFA *****"<<endl<<endl;
    vector<vector<vector<int>>> dfa;
    vector<vector<int> > states;
    states.push_back(closure(0,table));
    queue<vector<int> > q;
    q.push(states[0]);
    while(!q.empty()){
        vector<int> f=q.front();
        q.pop();
        vector<vector<int> > v;
        for(int i=0;i<alpha;i++){
            vector<int> t;
            set<int> s;
            for(int j=0;j<f.size();j++){
                for(int k=0;k<table[f[j]][i].size();k++){
                    vector<int> cl= closure(table[f[j]][i][k],table);
                    for(int h=0;h<cl.size();h++){
                        if(s.find(cl[h])==s.end())
                        s.insert(cl[h]);
                    }
                }
            }
            for(set<int >::iterator u=s.begin(); u!=s.end();u++)
                t.push_back(*u);
            v.push_back(t);
            if(find(states.begin(),states.end(),t)==states.end())
            {
                states.push_back(t);
                q.push(t);
            }
        }
        dfa.push_back(v);
    }
    printdfa(states,dfa);
}

测试数字输入正确的简单方法是测试操作:

if (!(cin >> n))
{
  std::cerr << "Invalid input, expected number".
  return 0;
}

但是,这不包括以下情况:
1b683 -- 输入停止在 "b" 和 returns 值 1
3.14159 -- 输入在“.”处停止和 returns 值 3。

要捕获上述异常,您可能需要执行解析,或者可能需要执行正则表达式。对于简单的程序,两者都比较复杂。