3

我是 C++ 新手。我正在做一个项目,我需要通过控制台从用户那里读取大部分整数。为了避免有人输入非数字字符,我考虑将输入读取为字符串,检查其中只有数字,然后将其转换为整数。我创建了一个函数,因为我需要多次检查整数:

bool isanInt(int *y){
    string z;
    int x;
    getline(cin,z);
    for (int n=0; n < z.length(); n++) {
        if(!((z[n] >= '0' && z[n] <= '9') || z[n] == ' ') ){
            cout << "That is not a valid input!" << endl;
            return false;
        }
    }
    istringstream convert(z); //converting the string to integer
    convert >> x;
    *y = x;
    return true;
}

当我需要用户输入一个整数时,我会调用这个函数。但是由于某种原因,当我调用这个函数时,程序不会等待输入,它会立即跳转到处理空字符串的 for 循环。有什么想法吗?谢谢你的帮助。

4

6 回答 6

9

有很多方法可以仅测试字符串中的数字字符。一个是

bool is_digits(const std::string &str) {
    return str.find_first_not_of("0123456789") == std::string::npos;
}
于 2013-10-30T09:42:09.340 回答
3

这会起作用:

#include <algorithm> // for std::all_of
#include <cctype>    // for std::isdigit

bool all_digits(const std::string& s)
{
  return std::all_of(s.begin(), 
                     s.end(), 
                     [](char c) { return std::isdigit(c); });
}
于 2013-10-30T10:14:47.097 回答
2

字符分类是一项通常委托给ctype区域设置方面的工作。您将需要一个考虑所有 9 位数字的函数,包括千位分隔符和小数点:

bool is_numeric_string(const std::string& str, std::locale loc = std::locale())
{
    using ctype = std::ctype<char>;
    using numpunct = std::numpunct<char>;
    using traits_type =  std::string::traits_type;

    auto& ct_f  = std::use_facet<ctype>(loc);
    auto& np_f = std::use_facet<numpunct>(loc);

    return std::all_of(str.begin(), str.end(), [&str, &ct_f, &np_f] (char c)
    {
        return ct_f.is(std::ctype_base::digit, c) || traits_type::eq(c, np_f.thousands_sep())
                                                 || traits_type::eq(c, np_f.decimal_point());
    });
}

请注意,需要额外的努力来确保千位分隔符不是第一个字符。

于 2013-10-30T12:18:34.823 回答
2

您可以在 try/catch 块中转换字符串,这样如果转换失败,它会引发异常,您可以在控制台中编写任何您想要的内容。

例如:

  try
  {
    int myNum = strtoint(myString);
  }
  catch (std::bad_cast& bc)
  {
     std::cerr << "Please insert only numbers "<< '\n';
  }
于 2013-10-30T09:41:44.777 回答
-2

尝试另一种方式,如 cin.getline(str,sizeof(str)),这里的 str 是 char*。在调用此函数之前,我认为您的问题可能是由其他函数引起的。也许你可以仔细检查你的代码的其他部分。也建议设置断点。

于 2013-10-30T09:53:55.690 回答
-3

始终使用现成的功能。永远不要一个人写。我推荐 std::regex

享受。

于 2013-10-30T09:43:17.423 回答