如何循环遍历 C++ 中的某些 Ascii 字符

How to loop through certain Ascii characters in c++

我只想遍历某些 Ascii 字符,并不是所有字符都直接相邻。例如,我只想从 char '1 到 7' 循环,然后从 char '?到F'。我不想循环“8 到 >”。我有这个 for 循环,但这将包括我不想要的字符。

for (char i = '1'; i < 'H'; i++)

我应该如何修改它以仅循环我想要的内容?

每个字符都有一个与之关联的固定 ASCII 值。您可以引用具有该特定 ASCII 值的任何字符。您可以使用 'if' 条件跳过不需要的字符。您会发现所有 ASCII 值 here。参考您的示例,如果您想跳过“?”中的字符至 'F',代码可能如下所示:

#include <iostream>

using namespace std;

int main()
{
    for (char i = '1'; i < 'H'; i++)
    {
        if(i>=63 && i<=70)
        // 63 is the ASCII value for '?'
        // 70 is the ASCII value for 'F'
        {
            // skipping the ASCII values we do not need
            continue;
        }
    
        cout << i << "";
    }

    return 0;
}

17 的循环是直接的,因为所有 C 都需要阿拉伯数字('0''9')来连续增加值和 C++ 标准。

for (char c = '1'; c <= '7'; ++c)

或(更常见的样式)

for (char c = '1'; c < '8'; ++c)

尝试遍历第二组 ASCII 字符('?''F')的问题在于存在 ASCII 以外的字符集 - 其中字符的顺序不同。例如,在 ASCII 中,'?''@' 小一,但对于其他字符集则不能保证。相反,创建一个包含要循环的字符的字符串,然后遍历该字符串。例如;

const std::string characterset = "?@ABCDEF";

for (char c : characterset)      // option 1, C++11 and later
{
     // do something with c
}

for (auto c : characterset)      // option 2, C++11 and later (type deduction)
{
     // do something with c
}

// Option 3 (all C++ standards)

for (std::string::const_iterator it = characterset.begin(), end = characterset.end();
     it != end; ++it)
{
    char c = *it;
    // do something with *it or c (it is an iterator that references a character)
}

将遍历您的第二组字符。

如果您想在一个循环中完成所有操作,请更改字符集。例如,上面选项 1 的修改版本可能是;

const std::string characterset = "1234567?@ABCDEF";

这是一种更通用的方法,不依赖于支持 ASCII 字符集(或兼容)的实现(主机系统、编译器、库)。

创建一个包含您要循环的字符的集合并循环该集合。 例如:

#include <iostream>
#include <stdexcept>
#include <string>
#include <set>

// character_set.h
//-------------------------------------------------------------------------
// To be able to easily input a character range we need a helper struct

struct character_range_t
{
    // have this destructor so a character range can be used in brace initialization.
    character_range_t(const char f, const char t) :
        from(f),
        to(t)
    {
        if (to < from) throw std::invalid_argument("to must be larger or equal to from");
    }

    char from;
    char to;
};

//-------------------------------------------------------------------------
// helper function to combine multiple character ranges into on set
// input is a compile time array of ranges

template<std::size_t N>
auto make_character_set(const character_range_t(&ranges)[N])
{
    // I chose a set because all elements must be unique and set does that.
    std::set<char> set;

    // loop over all input ranges
    for (std::size_t n = 0; n < N; ++n)
    {
        // and for each range add the characters in the range to the set
        for (char c = ranges[n].from; c <= ranges[n].to; ++c) set.insert(c);
    }

    return set;
}

// main.cpp 
//-------------------------------------------------------------------------
// #include "character_set.h"

int main()
{
    auto set = make_character_set({{'1','7'},{'?','F'}});

    // use range based for loop to loop over all characters in the set
    for (const char c : set)
    {
        std::cout << c << " ";
    }
}