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