You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用isdigit()无法正确识别字符串数字 函数仅8位以上输入返回true如何解决

问题成因
  • 核心错误是误用sizeof计算字符串长度:代码中myString是char*类型的指针,在64位操作系统中指针的内存占用固定为8字节,因此sizeof(myString)返回的是指针本身的大小,而非指针指向的字符串的实际长度。
  • 当输入字符串长度小于8时,循环会遍历到字符串末尾的'\0'结束符,该字符不属于允许的数字、空格、减号范畴,会触发异常直接返回false。
  • 当输入字符串长度≥8时,循环跑完8次就会直接退出,不仅会漏掉8位之后的非法字符检测,还会触发内存越界访问的未定义行为,存在安全隐患。
解决方法

下面提供3种可行的修复方案:

  1. 最小改动修复:使用QByteArray的size()方法获取实际字符长度
    将代码中size_t size = sizeof(myString);替换为size_t size = ba.size();即可,QByteArray的size()方法会返回实际存储的字符长度,完全匹配需要遍历的范围。

  2. 更符合Qt开发规范的优化方案:直接遍历QString无需转C风格字符数组,避免编码问题同时简化代码:

bool MainWindow::inputExcp()
{
    QString inputStr = ui->input->toPlainText();
    for (const QChar& c : inputStr) {
        if (c.isDigit() || c == ' ' || c == '-') {
            continue;
        }
        QMessageBox::warning(this, "输入错误", "仅允许输入数字、空格和减号");
        return false;
    }
    return true;
}
  1. 保留C风格字符串逻辑的修复方案:用strlen(myString)代替sizeof(myString)计算字符串长度,该方法会统计到'\0'结束符之前的所有字符数,注意需要引入<cstring>头文件。

内容的提问来源于stack exchange,提问作者Jugennd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 18:15:03