检查输入是否是正确的整数

时间:2010-11-08 20:47:30

标签: c++ c

检查输入时遇到一些问题。我知道已经有类似的问题,但是从根本上说它并没有解决我的问题。我已经在使用其他问题中的一个建议而且它不起作用。

#include <iostream>
#include <stdio.h>
#include <ctype.h>


int main ()
{
 int a;

 printf("Please type in your number: ");
 scanf_s("%d", &a);

 if(isdigit(a))
 {
    printf("True.");
 }
 else
 {
 printf("False.");
 }

 std::cin.get();
 std::cin.get();

 return 0;

}

我不知道我做错了什么,但当我输入一个数字时,我的输出总是“假”。当我输入一个字母时,编译器有错误。

11 个答案:

答案 0 :(得分:3)

  1. a已经是整数变量。 std::isdigit仅检查字符是否与数字相对应,即字符'0''9'

  2. 尽量不要将C库(printfscanf等)与C ++库(coutcin)混合使用。坚持任何一个。

  3. 至于如何实际检查用户是否输入了号码see this answer

答案 1 :(得分:2)

您使用的isdigit功能不正确。

即使isdigit收到int作为唯一参数,它也希望char值(表示ASCII字母的字节/数字)不是纯int你现在正在使用它。

即:

is_digit('1'); // true
is_digit('a'); // false

scanf已经返回一个已解析的整数值,因此您无需检查它是否为数字。

也许如果你指明你想要完成什么,我们可以提供更多帮助。

答案 2 :(得分:2)

虽然isdigit()int作为参数,但它会检查变量的字符值。这样:

scanf_s("%d", &a);

给出一个整数值,而不是字符值。

答案 3 :(得分:2)

您正在使用带有%d的scanf,它会将数字转换为整数,但isdigit旨在处理尚未转换的原始字符。如果您使用它,您(可能)想要读取一个字符串,然后检查输入的所有字符是否都是数字(使用isdigit)并且只有在您完成后才会尝试转换为整数。

或者,您可以使用类似strtol的字符串将字符串转换为整数,并告诉您失败的位置(以及它)。

答案 4 :(得分:2)

如果您需要在c中执行此操作,请按照其他人已发布的答案进行操作。

如果你想在c ++中这样做,我建议:

int num = boost::lexical_cast<int>( somestring );

关于boost::lexical_cast

的文档

答案 5 :(得分:1)

isdigit接受一个字符并返回true或false,具体取决于该字符是否为数字。所以你可以在整数的字符串表示的每个字符上使用它,但你的'a'已经是一个整数,由scanf_s设置

scanf_s只会将输入的第一个数字转换为等效整数,然后停止扫描。你需要处理输入的实际字符,所以你可能想要像fgets这样的东西。

一旦你有了字符串,你可以遍历它中的每个字符,检查它是否是一个数字(或者你可以使用像strtol这样的库函数来为你做这个并返回整数值,然后检查它是否全部消耗了这样做的输入(拒绝像123X这样的东西)

答案 6 :(得分:1)

我建议在一个字符串中读一行,然后根据你的需要尝试解析该字符串。如果解析失败,只需再次提示用户。您可以将杂乱的细节隐藏在功能模板中:

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

template <typename T>
T read(std::string prompt)
{
    for (; ;)
    {
        std::cout << prompt;
        std::string line;
        getline(std::cin, line);
        std::istringstream ss(line);
        T x;
        if ((ss >> x) && (ss >> std::ws).eof()) return x;
    }
}

int main ()
{
    int a = read<int>("Please type in your number: ");
    std::cout << "You entered " << a << '\n';
}

答案 7 :(得分:1)

请勿使用scanf和家人。使用fgets然后strtol / strtoul /等。解析数字。

答案 8 :(得分:1)

如果您确实决定使用scanf,则可以通过检查scanf的返回值来验证转换是否发生。它返回成功处理的格式项的数量,或者出错时为-1。在您的情况下,成功输入应从scanf返回1。

http://www.cplusplus.com/reference/clibrary/cstdio/scanf/

答案 9 :(得分:1)

这是另一种更符合C ++精神的方法(虽然我不是C ++专家,因此可能有更好的方法):

#include <iostream>
#include <exception>
#include <cctype>

int main()
{
  using namespace std;

  int a;
  cout << "Please type in your number: " << flush;

  /**
   * Tell the input operation to throw an exception if the input
   * is not properly formatted for the target data type; note that
   * this will only catch bad input that *starts* with a non-numeric 
   * character.
   */
  cin.exceptions(ios_base::failbit); 

  try
  {
    cin >> a;
    if (!isspace(cin.get())
      cout << "false" << endl; // non-numeric, non-whitespace character found
                               // at end of input string, e.g. "12w"
    else
      cout << "true" << endl;
  }
  catch(ios_base::failure& e)  // non-numeric, non-whitespace character found
  {                            // at beginning of input string, e.g. "x23"
    cout << "false" << endl;
  }

  return 0;
}

答案 10 :(得分:0)

现在我找到了一个适合我的解决方案,但仍然存在一些问题。这是我修改过的代码:

#include <iostream>
#include <stdio.h>
#include <ctype.h>


int main ()
{
 int a;

 printf("Please type in your number: ");

 if(scanf_s("%d", &a) == 1)
 {
 printf("True.");
 }
 else
 {
 printf("False.");
 }

 std::cin.get();
 std::cin.get();

 return 0;

}

现在问题是我必须为我输入的每个字母添加一个“std :: cin.get()”。这太疯狂了。因此,当我想检查“你好”是否是一个数字时,我必须将总数量为7x“std :: cin.get()”来保持屏幕,以便我可以看到结果。