如何在字符串中只插入数字

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] &lt; '0' || digits[i] &gt; '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表chars: https://www.techonthenet.com/ascii/chart.php

【讨论】:

您可能希望使用std::count_ifstd::isdigit 提出解决方案。 @ThomasMatthews 我确实使用了 std::isdigit 合并。它会清理您的 else 案例。 请注意,即使程序使用的字符编码不是 ASCII,std::isdigit 也会得到正确答案。 +1。【参考方案2】:

if (digits[i] &lt; 0 || digits[i] &gt; 9) 正在检查 digits[i] 的字符值是否小于 0 或大于 9。字符 '0' 在今天的大多数编码中是字符 48(最值得注意的是 ASCII),因此无法进行检查。您应该检查if (digits[i] &lt; '0' || digits[i] &gt; '9') - 并且已经有一个函数可以执行此操作。 std::isdigit.

您还可以使用标准算法std::all_of 来检查字符串中的所有chars 是否实际上是数字。

例子:

#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 才会设置为真。

以上是关于如何在字符串中只插入数字的主要内容,如果未能解决你的问题,请参考以下文章

python如何将列表中只出现一次的数字输出

Teradata SQL从中文数字字母混合字符串中只提取数字regexp_substr

如何在 swift 2.0 中只允许 UITextfield 中的某些数字集

假定输入的字符中只包含字母和“ * ”号。编写一个函数fun,该函数的功能是将字符串中前导“ *

在JAVA中,键盘输入的字符串中包含的字母、数字和其他字符的个数如何制作?

请问如何从一列包含大小写字母、数字、汉字、全角字符的数据中只把由汉字组成的数据查出来,oracle 10g