我可以检查输入的值是字符串还是整数在c++

Can i check if entered value is string or integer in c++

本文关键字:整数 c++ 字符串 我可以 输入 检查      更新时间:2023-10-16

我想检查用户输入的值是字符串还是整数。代码中的输入是cin>>obj[i].int_code;

问题是,如果用户输入任何字符串而不是整数,程序将进入无限循环。

#include<iostream>
using namespace std;
class item{
public:
    int int_code;
    string str_name;
};
item obj[100];
main(){
    int c,i=0,int_cd,n=0,pos=0;
    do{
        cout<<"n_______YOUR OPTIONS________n";
        cout<<"t1.Add Itemnt2.View Itemnt3.Delete Itemnt4.List Itemnt5.Exitn";
        cout<<"Enter your choice: ";
        cin>>c;
        switch(c){
            case 1://Add Item
                cout<<"Enter the item_code: ";
                cin>>obj[i].int_code;
                cout<<"Enter the item_name: ";
                cin>>obj[i].str_name;
                i++;
                n++;
                break;
            case 2://View item
                cout<<"Enter the item_code: ";
                cin>>int_cd;
                for(i = 0;i < n;i++)
                    if(int_cd == obj[i].int_code)
                        cout<<obj[i].int_code<<"t"<<obj[i].str_name<<"n";
                break;
            case 3://Delete Item
                cout<<"Enter the item_name: ";
                cin>>int_cd;
                for(i = 0;i < n; i++)
                    if(int_cd==obj[i].int_code)
                        pos=i;
                for(i=pos;i<n;i++){
                    if(obj[i].int_code != NULL)
                        obj[i]=obj[i+1];
                    else
                        obj[i].int_code=NULL;
                        //obj[i].str_name=;
                }
                n--;
                break;
            case 4://list Item
                for(i=0;i<n;i++)
                    cout<<obj[i].int_code<<"t"<<obj[i].str_name<<"n";
                break;
            default:
                cout<<"Enter any number between 1 to 5";
                break;
        }
    }while( c != 5 );
}
    enter code here

使用boost::lexical_cast:

    string str;
    cin >> str;
    int val;
    try
    {
        val = lexical_cast<int>(str));
    }
    catch(const bad_lexical_cast &)
    {
        // not an int
    }

修改行

cin>>c;

c = -1;
cin>>c;
if (c < 1 || c > 5)
{
    cout<<"Enter any number between 1 to 5";
    continue;
}

作为lexical_cast的替代方案,您可以这样做:

#include <iostream>
static const int ZERO_ASCII = 48;
static const int MAX_OPTION = 5;
static const int MIN_OPTION = 1;
int main() {
    std::string input;
    std::cin >> input;
    if(input.length() > 1 ){
        std::cout << "Not correct length" << input << std::endl;
        return -1; // in your case use "continue"
    }
    char val = *(input.c_str());
    int intVal = static_cast<int>(val);
    int option = intVal - ZERO_ASCII; // see your printed out ASCII chart :)
    if (MIN_OPTION > option || option > MAX_OPTION) {
        std::cout << "Not valid value " << option << std::endl;
        return -1; // in your case use "continue"
    }
    std::cout << "selected option " << option << std::endl;
}

这是一个有效的选项,原因如下:

  1. 您的用户正在给您一个随机字符串值。所以你的程序应该读取一个随机字符串值,然后验证它。
  2. 你可以应用任何你喜欢的检查。我在这里核对了一下它是一个字符长,值是ASCII
  3. 表示一个数字,并且该数字在一个范围内。
  4. 对于简单的验证,使用if语句比使用异常成本更低,因为用户通常会给你垃圾输入。

非号码退出:

#include<iostream>
using namespace std;
class item{
public:
  int int_code;
  string str_name;
};
item obj[100];
main(){
  int c,i=0,int_cd,n=0,pos=0;
  do{
    cout<<"n_______YOUR OPTIONS________n";
    cout<<"t1.Add Itemnt2.View Itemnt3.Delete Itemnt4.List Itemnt5.Exitn";
    cout<<"Enter your choice: ";
    cin >> c;
    if (!cin) break;
    switch(c){
    case 1://Add Item
      cout<<"Enter the item_code: ";
      cin>>obj[i].int_code;
      cout<<"Enter the item_name: ";
      cin>>obj[i].str_name;
      i++;
      n++;
      break;
    case 2://View item
      cout<<"Enter the item_code: ";
      cin>>int_cd;
      for(i = 0;i < n;i++)
    if(int_cd == obj[i].int_code)
      cout<<obj[i].int_code<<"t"<<obj[i].str_name<<"n";
      break;
    case 3://Delete Item
      cout<<"Enter the item_name: ";
      cin>>int_cd;
      for(i = 0;i < n; i++)
    if(int_cd==obj[i].int_code)
      pos=i;
      for(i=pos;i<n;i++){
    if(obj[i].int_code != 0)
      obj[i]=obj[i+1];
    else
      obj[i].int_code= 0;
    //obj[i].str_name=;
      }
      n--;
      break;
    case 4://list Item
      for(i=0;i<n;i++)
    cout<<obj[i].int_code<<"t"<<obj[i].str_name<<"n";
      break;
    default:
      cout<<"Enter any number between 1 to 5";
      break;
    }
  }while( c != 5 );
}

请注意,"检查输入的值是字符串还是整数"部分在应用程序的多个部分都存在问题。也就是说,情况1、2和3都需要整数输入(情况3将在下面进一步讨论)。get_int和get_string方法改编自如何使cin只接受数字。最初我只创建了一个get_int方法;然而,我发现也需要一个get_string,否则在"Add Item"(case 1)完成后,"Enter your choice"会出现两次,而不是一次。

此外,case 3中的"Delete Item"在措辞上有错误,因为请求的是"item_name";然而,cin期望一个整数,而不是字符串,所以我修改了那里的措辞以及输入法。我在默认情况下注释掉了cout语句,因为如果之前的情况不适用于输入的值,那么它现在是多余的。最后,"Delete Item"代码中仍然有一个bug(下面修复),因为删除item_code 2的请求将删除item_code 1,如果该item_code 1仅包含由于pos未被重置的Item。

#include <iostream>
#include <limits>
#include <sstream>
#include <string>
using namespace std;
class item
{
    public:
       int int_code;
       string str_name;
};
item obj[100];
string get_string(string message)
{
    string line = "";
    string rs = "";
    cout << message;
    getline(cin, line);
    stringstream ss(line);
    ss >> rs;
    return rs;
}
int get_int(string message)
{
    int ri = -1;
    string line = "";
    bool isint = false;
    while (!isint)
    {
        cout << message;
        getline(cin, line);
        stringstream ss(line);
        if (ss >> ri)
        {
            if (ss.eof())
            {   // Success
                isint = true;
            }
        }
    }
    return ri;
}
int main (int argc, char ** argv)
{
    int c,i=0,int_cd,n=0,pos=0;
    do
    {
        cout<<"n_______YOUR OPTIONS________n";
        cout<<"t1.Add Itemnt2.View Itemnt3.Delete Itemnt4.List Itemnt5.Exitn";
        c = get_int("Enter your choice: ");
        switch(c){
            case 1://Add Item
                obj[i].int_code = get_int("Enter the item_code: ");
                obj[i].str_name = get_string("Enter the item_name: ");
                i++;
                n++;
                break;
            case 2://View item
                int_cd  = get_int("Enter the item_code: ");
                for(i = 0;i < n;i++)
                    if(int_cd == obj[i].int_code)
                        cout<<obj[i].int_code<<"t"<<obj[i].str_name.c_str()<<"n";
                break;
            case 3://Delete Item
                int_cd  = get_int("Enter the item_code: ");
                pos = -1;
                for(i = 0;i < n; i++)
                    if(int_cd==obj[i].int_code)
                        pos=i;
                // ensure specified item_code is found before deleting an item
                if(pos != -1)
                {
                    for(i=pos;i<n;i++)
                    {
                        if(obj[i].int_code != NULL)
                            obj[i]=obj[i+1];
                        else
                            obj[i].int_code=NULL;
                            //obj[i].str_name=;
                    }
                    n--;
                }
                break;
            case 4://list Item
                for(i=0;i<n;i++)
                    cout<<obj[i].int_code<<"t"<< obj[i].str_name.c_str() <<"n";
                break;
            default:
                //cout<< "Enter any number between 1 to 5" << endl;
                break;
        }
    } while( c != 5 );
    return 0;
}