c++ 如何确保字符串是数字

ffscu2ro  于 2023-03-05  发布在  其他
关注(0)|答案(3)|浏览(170)
/* Checks if the inventory is valid. Criteria: Valid if and only if it contains only digits
*/
bool isValidInventory(string token) {
    char ch; // Will be used to store characters of a token so that they can be checked individually.
    for (int i = 0; i < token.length(); i++) {
        ch = token[i];

        if (isdigit(ch)) {
            return true;
        } else {
            return false;
        }
    }
} // End of isValidInventory() function.

这个函数从本质上接受一个从字符串中提取出来的令牌,并验证它是否是整数。但是,我遇到了一个数字11.的问题,我没有得到我想要的结果,这是一个消息,说库存是无效的,因为11.不仅仅是数字。
我试过

if (isdigit(ch) && !ispunct(ch)) {}

但这不起作用,显然mod在这里也不起作用,因为11.0%1 = 0。

ahy6op9u

ahy6op9u1#

在循环的第一次迭代时返回true或false。
您的代码甚至不可能查看字符串的第二个字符。

lp0sw83n

lp0sw83n2#

您的函数存在3个问题:

  • 不管isdigit()返回什么,它总是return在第一次迭代时的一个值,所以,你没有检查整个token
  • 如果token为空,则函数表现出 * 未定义行为 *,因为它根本不对任何值执行return操作。
  • 在将char传递给isdigit()之前,需要将其强制转换为unsigned char

试试这个:

bool isValidInventory(const string &token) {
    if (token.empty()) {
        return false;
    }
    unsigned char ch;
    for (size_t i = 0; i < token.length(); ++i) {
        ch = static_cast<unsigned char>(token[i]);
        if (!isdigit(ch)) {
            return false;
        }
    }
    return true;
}
68bkxrlz

68bkxrlz3#

如果字符串token111102之类的数字,则此操作应该有效。

bool isValidInventory(string token) {
    for (auto ch: token) 
        if (isdigit(ch) == false) return false;
    return true;
}

在这种情况下,数字的格式类似于11.00。您可能需要检查此.特定字符。

bool isValidInventory(const string& token, int dotCount = 0) {
    for (auto ch: token) {
        if (ch == '.') { if (++dotCount > 1) return false; }
        else if (isdigit(ch) == false) return false;
    }
    return token.size();  // for this logic thanks to Remy Lebeau 
}

相关问题