如何在字符串中只插入数字
Posted
技术标签:
【中文标题】如何在字符串中只插入数字【英文标题】:how to insert only digits in a string 【发布时间】:2021-05-24 17:17:22 【问题描述】:我有这段代码可以检查用户是否在字符串变量中输入了 3 位数字:
std::string digits;
bool error = false;
do
error = false;
std::cout << "Type 3 digits. (0 to 9)\n";
std::cin >> digits;
if (digits.size() != 3)
std::cout << "\nError, you must type 3 digits.\n\n";
error = true;
else
for (int i = 0; i < 3; i++)
if (digits[i] < 0 || digits[i] > 9)
std::cout << "\nError, you must type only digits. (0 to 9)\n\n";
error = true;
break;
while (error == true);
这没有给出任何错误,但仍然无法正常工作,它会正确检查用户何时插入超过 3 个字符,但即使输入正确 (123) 也会重新启动循环。
【问题讨论】:
您检查的是 ASCII 码,而不是数字的值。试试:if (digits[i] < '0' || digits[i] > '9')
@SHR 它有效,谢谢,我总是忘记对于字符我必须使用 ' 而不是 ",这就是它不起作用的原因
这是一个有效的字符串:“0A4B2”吗?它有 3 位数字。
【参考方案1】:
试试这个:
#include <string>
#include <iostream>
int main()
std::string digits;
bool error = false;
do
error = false;
std::cout << "Type 3 digits. (0 to 9)\n";
std::cin >> digits;
if (digits.size() != 3)
std::cout << "\nError, you must type 3 digits.\n\n";
error = true;
else
for (int i = 0; i < 3; i++)
if (!isdigit(digits[i]))
std::cout << "\nError, you must type only digits. (0 to 9)\n\n";
error = true;
break;
while (error == true);
这使用函数isdigit()
来检查当前char
是否为数字。
您之前的代码不起作用的原因是因为字符(在此示例中为 0,因为它是一个数字)'0'
实际上具有不同于 0 的字符代码。引用自 https://www.tutorialspoint.com/ascii-nul-ascii-0-0-and-numeric-literal-0#:~:text=The%20ASCII%20NUL%20character%20is,The%20decimal%20equivalent%20is%2048
,
当程序员使用'0'(字符0)时,它被视为0x30。这是一个十六进制数。十进制等效值为 48。
ASCII表char
s:
https://www.techonthenet.com/ascii/chart.php
【讨论】:
您可能希望使用std::count_if
和std::isdigit
提出解决方案。
@ThomasMatthews 我确实使用了 std::isdigit
合并。它会清理您的 else
案例。
请注意,即使程序使用的字符编码不是 ASCII,std::isdigit
也会得到正确答案。 +1。【参考方案2】:
if (digits[i] < 0 || digits[i] > 9)
正在检查 digits[i]
的字符值是否小于 0 或大于 9。字符 '0'
在今天的大多数编码中是字符 48(最值得注意的是 ASCII),因此无法进行检查。您应该检查if (digits[i] < '0' || digits[i] > '9')
- 并且已经有一个函数可以执行此操作。 std::isdigit
.
您还可以使用标准算法std::all_of
来检查字符串中的所有char
s 是否实际上是数字。
例子:
#include <algorithm> // std::all_of
#include <cctype> // std::isdigit
#include <iostream>
#include <string>
int main()
std::string digits;
// A char to unsigned char casting lambda (to make isdigit safe)
auto isdigit_lambda = [](char ch)
return std::isdigit(static_cast<unsigned char>(ch)) != 0; ;
while(true)
std::cout << "Type 3 digits. (0 to 9)\n";
if(not (std::cin >> digits))
// input failure - deal with that somehow
// if it has the correct size and all are digits, break out of the loop
if(digits.size() == 3 &&
std::all_of(digits.begin(), digits.end(), isdigit_lambda)) break;
std::cout << "\nError, you must type 3 digits.\n\n";
【讨论】:
【参考方案3】:我尽力保持代码最少:
#include <string>
#include <iostream>
#include <algorithm>
int main()
std::string digits;
bool error = true;
while (error)
std::cout << "Type 3 digits. (0 to 9)\n";
std::cin >> digits;
if (digits.size() not_eq 3 and (error = true))
std::cout << "\nError, you must type 3 digits.\n";
else if(std::any_of(digits.begin(), digits.end(), [](const auto& digit) return not std::isdigit(digit);) and (error = true))
std::cout << "\nError, you must type only digits. (0 to 9)\n\n";
else error = false;
【讨论】:
我想你的意思是==
有这个条件 error = true
@acraig5075 不,我这样做是为了将“真”分配给“错误”标志。 assignment operator =
返回分配的值,因此条件不会失败;只有当条件的第一部分为真(即输入中有错误)时,plus error 才会设置为真。以上是关于如何在字符串中只插入数字的主要内容,如果未能解决你的问题,请参考以下文章
Teradata SQL从中文数字字母混合字符串中只提取数字regexp_substr
如何在 swift 2.0 中只允许 UITextfield 中的某些数字集
假定输入的字符中只包含字母和“ * ”号。编写一个函数fun,该函数的功能是将字符串中前导“ *