【问题标题】:Can i check if entered value is string or integer in c++我可以在 C++ 中检查输入的值是字符串还是整数吗
【发布时间】:2014-06-10 10:08:56
【问题描述】:

我想检查用户输入的值是字符串还是整数。输入在代码中被视为 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 Item\n\t2.View Item\n\t3.Delete Item\n\t4.List Item\n\t5.Exit\n";
        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

【问题讨论】:

    标签: c++ string class integer cin


    【解决方案1】:

    使用boost::lexical_cast:

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

    【讨论】:

    • +1 我有很多时间来学习 lexical_cast。阅读起来相对快速且可爱。
    • 问题是你需要try...catch 块。你真的想要一些可以让你用简单的if 来检查错误的东西。
    • @JamesKanze 你总是可以将try..catch 块埋在像bool int_cast(const string&amp;, int&amp;) 这样的函数中
    • #include 。给出错误“没有这样的文件或目录”!。请问有没有简单的方法。通过任何简单的逻辑? ;)
    • @RaziKallayi 是的,using namespace boost; 这就是我将boost::lexical_cast 设为文档链接的原因。
    【解决方案2】:

    换行

    来自

    cin>>c;
    

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

    【讨论】:

    • int c;辛>>c;如果用户输入字符串,则 cin 无法将其分配给 c,因为 c 是 int 类型。 c 将包含旧值(第一次可以是 1..5 或一些垃圾)。它导致无限的while循环。这里的问题在 cin>>c 语句之前解决了,我分配了 c=-1;如果用户输入任何字符串值,此处 c 将具有 -1 并且“输入 1 到 5 之间的任何数字”将打印在控制台上
    【解决方案3】:

    作为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. 对于简单的验证,执行 if 语句的成本低于异常,因为用户经常给您垃圾输入。

    【讨论】:

      【解决方案4】:

      非数字时退出:

      #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 Item\n\t2.View Item\n\t3.Delete Item\n\t4.List Item\n\t5.Exit\n";
          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 );
      }
      

      【讨论】:

        【解决方案5】:

        请注意,“检查输入的值是字符串还是整数”部分是应用程序多个部分的问题。也就是说,案例 1、2 和 3 都需要整数输入(案例 3 将在下面进一步讨论)。 get_int 和 get_string 方法改编自How to make cin take only numbers。最初我只创建了一个 get_int 方法;但是,我发现还需要一个 get_string,否则在“添加项目”(案例 1)完成后,“输入您的选择”将出现两次,而不是一次。

        此外,案例 3 中的“删除项目”在措辞上有错误,因为请求是针对“项目名称”的;但是, cin 需要一个整数,而不是字符串,所以我修改了那里的措辞以及输入法。我在默认情况下注释掉了 cout 语句,因为如果以前的情况不适用于输入的值,它现在是多余的。最后,“删除项目”代码中仍然存在错误(已在下面修复),因为删除 item_code 2 的请求将删除 item_code 1,如果由于 pos 未重置而仅包含项目。

        #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 Item\n\t2.View Item\n\t3.Delete Item\n\t4.List Item\n\t5.Exit\n";
                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;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-10-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多