如何循环遍历 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;
}
从 1
到 7
的循环是直接的,因为所有 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 << " ";
}
}
我只想遍历某些 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;
}
从 1
到 7
的循环是直接的,因为所有 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 << " ";
}
}