C++ 生成std::isalpha计算为true的范围

C++ 生成std::isalpha计算为true的范围,c++,c++11,locale,C++,C++11,Locale,对某些人来说,这可能是一个微不足道的问题,但我找不到合适的答案。我想要的是生成一个范围(比如一个std::string),其中包含所有可能的chars,其中std::isalpha的计算结果为true 例如,对于默认语言环境,字符串应该是“A…Za…z”。但是,如果区域设置是法语,那么重音字母也应该属于字符串 附言:我从迪特·吕克那里得到了一个解决方案, 除了我的(OSX10.9.4g++4.9,clang++LLVM 5.1版(clang-503.0.40))之外,它似乎在所有平台上都能工作,

对某些人来说,这可能是一个微不足道的问题,但我找不到合适的答案。我想要的是生成一个范围(比如一个
std::string
),其中包含所有可能的
char
s,其中
std::isalpha
的计算结果为
true

例如,对于默认语言环境,字符串应该是
“A…Za…z”
。但是,如果区域设置是法语,那么重音字母也应该属于字符串

附言:我从迪特·吕克那里得到了一个解决方案, 除了我的(
OSX10.9.4
g++4.9
clang++
LLVM 5.1版(clang-503.0.40))之外,它似乎在所有平台上都能工作,在我的平台上,它在试图访问行中的
表[i]
时只会出现故障

if(table[i] & ctype::alpha)

我想知道是否有其他人可以在Mac或任何其他平台上重现该错误。

您可以直接使用ctype表,而不是通过生成一组字母顺序的字符来对字符进行分类:

#include <iostream>
#include <locale>

int main() {
    typedef std::ctype<char> ctype;
    std::locale locale;
    const ctype& facet = std::use_facet<ctype>(locale);
    const ctype::mask* table = facet.table();

    // You might skip this and work with the table, only.
    std::string result;
    for(unsigned i = 0; i < facet.table_size; ++i) {
        if(table[i] & ctype::alpha)
            result += char(i);
    }
    std::cout << result << '\n';
    return 0;
}
#包括
#包括
int main(){
typedef std::ctype ctype;
std::locale;
const ctype&facet=std::使用方面(locale);
const ctype::mask*table=facet.table();
//您可以跳过此操作,只使用表。
std::字符串结果;
for(无符号i=0;istd::cout如果您需要便携式解决方案,那么我想不出任何理由在所有可能的
char
值上运行
isalpha()
不是您的最佳选择


如果可以接受特定于平台的方法,则可以从平台的区域设置定义中提取信息。以下是一些文档,可以帮助您开始使用POSIX平台:

考虑使用
std::isalpha()递增并检查
char
变量
在循环中?是的,大致是这样。我正在对文本进行频率分析,有这样一个范围会很方便。有一个关于
isalpha
isalpha的c版本的非正式列表(图表c、const locale和loc)
取决于语言环境obviously@MooingDuck,感谢链接,我知道这些函数,我只是想知道如何生成范围?当然,解决方案是盲目迭代和测试
isalpha
(或者使用
std::transform
在预定义范围内使用
isalpha
作为谓词),但我认为可能存在一个更聪明的解决方案。@vsoftco:您可以对范围进行硬编码。或者一次测试一个。我唯一能想到的另一个可能的解决方案是,是否存在揭示此信息的其他API,但我怀疑it@vsoftco与valgrind一起运行:没有问题。这可能与我的库实现有关n(OSX,g++4.9,clang++)把事情搞砸的一行是
表[i]
if
中的
访问将试图找出我这边的错误。我会接受你的答案,因为它似乎运行在除OS X以外的任何平台上,试图找出实现中的错误,因为
libstdc++
libc++
似乎都已损坏。