我可以检查输入的值是字符串还是整数在c++
Can i check if entered value is string or integer in c++
我想检查用户输入的值是字符串还是整数。代码中的输入是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;
}
这是一个有效的选项,原因如下:
- 您的用户正在给您一个随机字符串值。所以你的程序应该读取一个随机字符串值,然后验证它。
- 你可以应用任何你喜欢的检查。我在这里核对了一下它是一个字符长,值是ASCII 表示一个数字,并且该数字在一个范围内。
- 对于简单的验证,使用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;
}
相关文章:
- 如何反转整数参数包
- enum是C++中的宏变量还是整数变量
- 努力将整数转换为链表。不知道我在这里做错了什么
- 整数不会重复超过随机数
- 在C++中手动调整数组大小
- 检查输入是否不是整数或数字
- C++使用整数的压缩数组初始化对象
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 如何只允许用户输入正整数
- 如何在c++中从文本文件中逐行读取整数
- C++:如何循环通过向量中的整数元素
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 序列化,没有库的整数,得到奇怪的结果
- 在一定长度后从数组中打印时缺少整数
- std::当在256字节边界上写入整数时,流的奇怪行为
- 内联程序集printf将整数解释为地址
- 是否基于数组B整数打印数组A中的整数
- 如何在C++中将整数转换为其数字数组