Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;计数字符类型(大写、小写、数字、特殊),不带if-else、三元或开关大小写。有什么想法吗?_C++_Count - Fatal编程技术网

C++ C++;计数字符类型(大写、小写、数字、特殊),不带if-else、三元或开关大小写。有什么想法吗?

C++ C++;计数字符类型(大写、小写、数字、特殊),不带if-else、三元或开关大小写。有什么想法吗?,c++,count,C++,Count,C++:在没有if-else、三元或开关大小写的情况下,如何计算每种字符类型(大写、小写、数字、特殊)的字符数。有什么想法吗 只需与相应的二进制函子一起使用。例如,以下方法 size_t count = 0; count += std::isdigit( c ) != 0; 如果要使用基于范围的for语句,可以编写 std::string s( /*Some string */ ); enum { UPPERCASE, LOWERCASE, DIGIT, PUNCTUATION, SIZE

C++:在没有if-else、三元或开关大小写的情况下,如何计算每种字符类型(大写、小写、数字、特殊)的字符数。有什么想法吗

只需与相应的二进制函子一起使用。

例如,以下方法

size_t count = 0;

count += std::isdigit( c ) != 0;
如果要使用基于范围的for语句,可以编写

std::string s( /*Some string */ );

enum { UPPERCASE, LOWERCASE, DIGIT, PUNCTUATION, SIZE = 4 };
size_t count[SIZE} = {};

for ( unsigned char c : s )
{
    count[UPPERCAsE]   += std::isupper( c ) != 0;
    count[LOWERCASE]   += std::islower( c ) != 0;
    count[DIGIT]       += std::isdigit( c ) != 0;
    count[PUNCTUATION] += std::ispunct( c ) != 0;
}
您还可以定义这些函数的数组。比如说

#include <iostream>
#include <string>
#include <cctype>

int main()
{
    std::string s( "There is text, 12345,.?!" );
    int (*check[] )( int ) = 
    { 
        std::isupper, std::islower, std::isdigit, std::ispunct 
    };

    const size_t N = sizeof( check ) / sizeof( *check );
    size_t count[N] = {};

    for ( unsigned char c : s )
    {
        for ( size_t i = 0; i < N; i++ ) count[i] += check[i]( c ) != 0;
    }

    for ( size_t n : count ) std::cout << n << std::endl;

    return 0;
}

使用
std::map
(您可以改用
char[256]
):


有什么想法吗?很抱歉,我不是很聪明。你可以构建一个数组,每个字符都有一个条目,并将其映射到一个特定的字符类型值。然后你真的只是做指针数学来确定你在看什么样的角色。还有很多其他的可能性。这个问题有什么特别的动机吗?然后享受UTF-8的乐趣。
1
10
5
5
std::map<char, std::function<void()>> m = {
    {'a', [&]() {++lowercase;} },
    // ..
    {'z', [&]() {++lowercase;} },
    {'A', [&]() {++uppercase;} },
    // ..
    {'Z', [&]() {++uppercase;} },
    {'0', [&]() {++digit;} },
    // ..
    {'9', [&]() {++digit;} },
};
for (char c : characters) {
    m.at(c)();
}