如何只允许变量中的数字?

时间:2017-02-28 22:47:26

标签: c++ io numbers iostream cin

我的代码遇到了一些问题,这是我遇到问题的代码的一部分。

此代码的一点是,如果用户输入的内容不是数字,例如字符p,程序应该要求用户再次输入,此部分可以正常工作。

如果用户输入数字和字符的组合,程序应该要求用户再次输入。例如,n1212n无效。

角色首先出现的部分,如n12不会导致问题,但问题出现在数字是第一个而其他第二个,如12n,这是无效的,但我的代码打印出数字12,后来表示该数字无效。

#include <iostream>

using namespace std;

int main ()
{
    int n;

    while(1)
    {

        cout<<"Enter a number, 0 for exit: ";
        cin>>n;

        if(!cin)
        {
            cout<<"You didnt enter a valid number\n";
            cin.clear();
            cin.ignore(1000,'\n');
            continue;
        }
        cout<<"Number is: "<<n<<endl;

        if(n==0) return 0;
    }
}

代码输出示例:

Enter a number, 0 for exit: 12
Number is: 12

Enter a number, 0 for exit: n
You didnt enter valid number

Enter a number, 0 for exit: n12
You didnt enter valid number

4°&lt; ---这个不能正常工作

Enter a number, 0 for exit: 12n
Number is: 12
Enter a number, 0 for exit: You didnt enter valid number

编辑:如果可能的话,我想解决这个问题而不包括额外的库。

3 个答案:

答案 0 :(得分:4)

您可以使用其他标准库中的isdigit()std::stringstd::all_of()(这没关系,而不是过度杀伤),就像这样(您将输入存储在字符串中,然后您检查对于该字符串的每个字符,isdigit函数是否成功,这意味着在这种情况下输入纯粹是数字的):

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

int main()
{
    std::string str;
    std::cin >> str;
    (std::all_of(str.begin(), str.end(), [] (char c) { return isdigit(c); })) ? std::cout << "It's a number!\n" : std::cout << "isdigit() failed\n";
    return 0;
}

输出:

Georgioss-MacBook-Pro:~ gsamaras$ g++ -Wall -std=c++0x main.cpp 
Georgioss-MacBook-Pro:~ gsamaras$ ./a.out 
4
It's a number!
Georgioss-MacBook-Pro:~ gsamaras$ ./a.out 
f
isdigit() failed
Georgioss-MacBook-Pro:~ gsamaras$ ./a.out 
12n
isdigit() failed

答案 1 :(得分:1)

您需要检查用户输入的整行,而不仅仅是其中的一部分。 istream::operator>>遇到不属于当前正在读取的数据类型的字符时停止读取。这就是12n之类的输入分别作为12n处理的原因。

您不会仅使用<iostream>功能解决此问题。最好使用std::getline()std::stoi() / std::strtol()等内容处理,例如:

#include <iostream>
#include <string>

using namespace std;

bool to_int(const string &str, int &i)
{
    size_t pos;
    i = stoi(str, &pos);
    return (str.c_str()[pos] == '\0');
}

int main ()
{
    string line;
    int n;

    do
    {
        cout << "Enter a number, 0 for exit: ";
        getline(cin, line);

        if (!to_int(line, n))
        {
            cout << "You didn't enter a valid number\n";
            continue;
        }

        cout << "Number is: " << n << endl;

        if (n == 0) break;
    }
    while (1);

    return 0;
}

如果您不想使用std::stoi()之类的转换功能,请至少使用std::istringstream

#include <iostream>
#include <string>
#include <sstream>

using namespace std;

bool to_int(const string &str, int &i)
{
    char c;
    istringstream iss(str);
    iss >> i;
    return !(iss.fail() || iss.get(c));
}

int main ()
{
    string line;
    int n;

    do
    {
        cout << "Enter a number, 0 for exit: ";
        getline(cin, line);

        if (!to_int(line, n))
        {
            cout << "You didn't enter a valid number\n";
            continue;
        }

        cout << "Number is: " << n << endl;

        if (n == 0) break;
    }
    while (1);

    return 0;
}

答案 2 :(得分:0)

循环显示数字,如果它有数字以外的内容,则打印“你没有输入有效数字”,否则打印数字。我们将以字符串形式输入并使用ctype.h来验证字符串的字符是否为数字:

#include <iostream>
#include <string>
#include <ctype.h>
using namespace std;

int main()
{
    string n;
    bool is_valid = true;

    while (1)
    {

        cout << "Enter a number, 0 for exit: ";
        cin >> n;
        for (size_t i = 0; i < n.length(); i++) {

            if (!isdigit(n[i])) {
                cout << "You didnt enter a valid number\n";
                is_valid = false;
                break;
            }
        }
        if (is_valid) cout << "Number is: " << n << endl;

        if (n == "0") return 0;
    }
}