2015-04-03 61 views
1

我已经搜索了这个答案,似乎没有人知道如何解决这个错误。我希望输入是一个整数。如果输入是双精度型,我希望它发送一个错误。区分int和double

int creatLegs = 0; 
string trash; 
bool validLegs = true; 
do 
{ 
    cout << "How many legs should the creature have? "; 
    cin >> creatLegs; 

    if(cin.fail()) 
    { 
     cin.clear(); 
     cin >> trash; //sets to string, so that cin.ignore() ignores the whole string. 
     cin.ignore(); //only ignores one character 
     validLegs = false; 
    } 

    if (creatLegs > 0) 
    { 

     validLegs = true; 
    } 

    if (!validLegs) 
    { 
     cout << "Invalid value, try again.\n"; 
    } 

} while (!validLegs); 

它似乎几乎工作。它发送错误,但只有在移到下一个循环之后。我怎样才能解决这个问题?为什么它仍然显示错误信息,但在显示之前仍然继续?

+0

对不起,我不太明白你的意思。不,它不会将其存储为int。如果我输入的内容不是int,它不知道该怎么做。它吐出垃圾邮件,直到我添加了“if(cin.fail())” – 2015-04-03 06:48:19

+1

cout <<“\ n”不刷新输出缓冲区,而cout << endl。见http://en.cppreference.com/w/cpp/io/manip/endl – amdn 2015-04-03 06:53:14

回答

0

我认为你要读的数据字符串,然后检查它通过字符验证它是整数 - 如果每个字符都是一个数字,那么我们有整数,我们可以解析它。

问题与流是,如果你想读取整数,但通过十进制,它读取数字直到点。这部分是一个适当的整数,所以cin.fail()返回false

示例代码:

#include <iostream> 
#include <string> 
#include <cctype> 
#include <cstdlib> 

using namespace std; 

int main() { 
    int creatLegs = 0; 
    bool validLegs = true; 
    do 
    { 
     cout << "How many legs should the creature have? "; 
     string input; 
     getline(cin, input); 

     validLegs = true; 
     for (string::const_iterator i = input.begin(); validLegs && i != input.end(); ++i) { 
      if (!isdigit(*i)) { 
       validLegs = false; 
      } 
     } 

     if (!validLegs) 
     { 
      cout << "Invalid value, try again.\n"; 
     } else { 
      creatLegs = atoi(input.c_str()); 
     } 

    } while (!validLegs); 

    cout << creatLegs << endl; 
} 

当然这不是一个完美的解决方案。如果有任何前导或尾随空格(或任何其他字符,如+-),程序将失败。但是,如果需要,您总是可以添加一些代码来处理这些情况。

+0

我绝对可以做这个工作。谢谢! – 2015-04-03 07:09:38

+0

你可以[接受我的回答](http://stackoverflow.com/help/accepted-answer)[而不是说谢谢](http://stackoverflow.com/help/someone-answers);) – tmp 2015-04-03 07:28:23

+0

我试过投票,但它说我的声誉不够高,所以我认为我也无法接受答案。我不好,我必须习惯这个网站。谢谢你! – 2015-04-03 16:27:05

0
int creatLegs = 0; 
do 
{ 
    cout << "How many legs should the creature have? "; 
    cin >> creatLegs; // trying to get integer 
    if(!cin.fail())  // if cin.fail == false, then we got an int and leave loop 
     break; 
    cout << "Invalid value, try again.\n"; // else show err msg and try once more 
    cin.clear(); 
} while (1); 
+0

这不会拒绝输入为'1.23' – 2015-04-03 06:52:22

+0

当我输入一个字母时会崩溃我的程序。现在我已经设置了它的方式,它会在输入字母时发送错误。 – 2015-04-03 06:54:43

2

输入可以比的整数或浮点数的表示别的东西。

记住数字不是它们的表示(一个或多个):9(十进制),017(八进制,点菜C),0b1001(二进制,点菜ocaml的),IX(罗马符号),8+1(算术表达式), neuf(法语)都是相同数字9的表示。

所以你如果接受一个输入像9 x,或9(与数字几经空格),...更多一般你必须定义什么是可以接受的输入(如果输入的结束来决定在是否结束,是否应该接受空格或标点符号等)。

您可以阅读整行(例如std::getline)并使用例如sscanfstd::stol(在您使用结束指针)(其中%n控制格式是有用的,所以项目计数通过sscanf返回)解析它

还要注意的是你的问题的措辞(“一之辨int和一个double“)是错误的。在C++中没有单个“int”或“double”类型(但是int是标量类型,而double是C++中的标量类型,您可以使用tagged union来定义class以保留其中任何一个)。 AFAIU,如果声明int x;然后使用std::cin >> x;与用户输入12.64点和数字64它不会被解析后x将成为12

+0

我现在只想整理一下,这样我就能理解它是如何工作的。包括所有不同的方式来说出一个数字会更好,但由于这只是一个简单的程序,所以我不想太深入。谢谢你。我不会放弃你在最后一部分所说的话。我不熟悉C++的编码,如果你可以稍微低下一点,我会很感激。 – 2015-04-03 06:59:49

+0

请按照我给你的链接。我相信你会设法自己编码。理解文档是软件开发非常重要的一部分,所以你需要学习如何阅读文档。玩的开心! – 2015-04-03 07:01:15

+0

非常感谢! – 2015-04-03 07:09:17

0

这个问题已经有了一个可以接受的答案,但是我会提供一个解决方案来处理所有不可分割的数字,甚至那些以浮点数表示的数字(不包含小数部分),并拒绝包含其他任何数据的输入数字之后的空格。可接受的值

例子,这些都代表人数4:拒绝值

4 
4. 
4.0 
+4 
004.0 
400e-2 

例子:

3.999999 
4.000001 
40e-1x 
4, 
#include <iostream> 
#include <sstream> 
#include <cctype> 
#include <string> 

using namespace std; 

bool get_int(const string & input, int & i) { 
    stringstream ss(input); 
    double d; 
    bool isValid = ss >> d; 
    if (isValid) { 
     char c; 
     while(isValid && ss >> c) isValid = isspace(c); 
     if (isValid) { 
      i = static_cast<int>(d); 
      isValid = (d == static_cast<double>(i)); 
     } 
    } 
    return isValid; 
} 

int main(int argc, char *argv[]) 
{ 
    int creatLegs = 0; 
    bool validLegs = false; 

    do 
    { 
     string line; 
     do { 
      cout << "How many legs should the creature have? "; 
     } while (not getline (cin,line)); 

     validLegs = get_int(line, creatLegs); 

     if (creatLegs <= 0) 
     { 
      validLegs = false; 
     } 

     if (not validLegs) 
     { 
      cout << "Invalid value, try again." << endl; 
     } 

    } while (not validLegs); 

    cout << "Got legs! (" << creatLegs << ")" << endl; 

    return 0; 
} 

如果你想严格整数(no小数期,而且没有科学计数法),然后使用这个简单get_int功能:

bool get_int(const string & input, int & i) { 
    stringstream ss(input); 
    bool isValid = ss >> i; 
    if (isValid) { 
     char c; 
     while(isValid && ss >> c) isValid = isspace(c); 
    } 
    return isValid; 
}