使用isdigit()无法正确识别字符串数字 函数仅8位以上输入返回true如何解决
问题成因
- 核心错误是误用
sizeof计算字符串长度:代码中myString是char*类型的指针,在64位操作系统中指针的内存占用固定为8字节,因此sizeof(myString)返回的是指针本身的大小,而非指针指向的字符串的实际长度。 - 当输入字符串长度小于8时,循环会遍历到字符串末尾的
'\0'结束符,该字符不属于允许的数字、空格、减号范畴,会触发异常直接返回false。 - 当输入字符串长度≥8时,循环跑完8次就会直接退出,不仅会漏掉8位之后的非法字符检测,还会触发内存越界访问的未定义行为,存在安全隐患。
解决方法
下面提供3种可行的修复方案:
最小改动修复:使用
QByteArray的size()方法获取实际字符长度
将代码中size_t size = sizeof(myString);替换为size_t size = ba.size();即可,QByteArray的size()方法会返回实际存储的字符长度,完全匹配需要遍历的范围。更符合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; }
- 保留C风格字符串逻辑的修复方案:用
strlen(myString)代替sizeof(myString)计算字符串长度,该方法会统计到'\0'结束符之前的所有字符数,注意需要引入<cstring>头文件。
内容的提问来源于stack exchange,提问作者Jugennd
相关产品推荐
相关产品推荐

