我试图通过遍历数组来查找索引号,但是我不能使用循环。可能吗?
我已经附加了代码来循环执行此操作。
#include <iostream>
using namespace std;
const char digits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', \
'A', 'B', 'C', 'D', 'E', 'F', };
int find_index(string str);
int main()
{
string str = "A";
cout << find_index(str) << endl;
}
int find_index(string str)
{
// using a loop, in this case for loop.
for (int i = 0 ; i < 16 ; i++)
{
// cout << digits[i] << endl;
if ( digits[i] == str[0] )
{
return i;
}
}
return -1;
}
是否可以不循环地做同样的事情?
答案 0 :(得分:0)
if (loopsAllowed == false) {
useRecursion();
}
else {
useLoops();
}
如果您对学校项目有奇怪的要求,这是一种非常标准的处理方式。我要避免的一件事是使用goto
跳到前面的代码部分。这实际上是循环的。
此外,在给定足够的堆栈内存的情况下,递归在技术上也可以使用循环。
答案 1 :(得分:0)
最好用数组代替字符串文字
const char *digits = { "0123456789ABCDEF" };
并使用标准C函数strchr
。例如
size_t find_index( char c )
{
const char *digits = { "0123456789ABCDEF" };
c = std::toupper( ( unsigned char )c );
const char *p = std::strchr( digits, c );
return p == nullptr ? -1 : p - digits;
}
这是一个演示程序。
#include <iostream>
#include <string>
#include <cstring>
#include <cctype>
size_t find_index( char c )
{
const char *digits = { "0123456789ABCDEF" };
c = std::toupper( ( unsigned char )c );
const char *p = std::strchr( digits, c );
return p == nullptr ? -1 : p - digits;
}
int main()
{
std::string s( "0123456789abcdef" );
for ( char c : s )
{
size_t i = find_index( c );
if ( i == size_t( -1 ) )
{
std::cout << "c is not a valid digit\n";
}
else
{
std::cout << c << ": " << i << '\n';
}
}
}
程序输出为
0: 0
1: 1
2: 2
3: 3
4: 4
5: 5
6: 6
7: 7
8: 8
9: 9
a: 10
b: 11
c: 12
d: 13
e: 14
f: 15
更严格的函数实现(不包含字符'\0'
)可以采用以下方式
size_t find_index( char c )
{
const char *digits = { "0123456789ABCDEF" };
const char *p = nullptr;
if ( c != '\0' )
{
c = std::toupper( ( unsigned char )c );
p = std::strchr( digits, c );
}
return p == nullptr ? -1 : p - digits;
}
另一种方法是使用标准算法。
例如
#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>
size_t find_index( char c )
{
static const char digits[] =
{
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F',
};
auto it = std::find( std::begin( digits ), std::end( digits ), std::toupper( ( unsigned char )c ) );
return it == std::end( digits ) ? -1 : std::distance( std::begin( digits ), it );
}
int main()
{
std::string s( "0123456789abcdef" );
for ( char c : s )
{
size_t i = find_index( c );
if ( i == size_t( -1 ) )
{
std::cout << "c is not a valid digit\n";
}
else
{
std::cout << c << ": " << i << '\n';
}
}
}
输出将与上面显示的相同。
对数组进行排序后,您还可以使用标准算法std::lower_bound
代替std::find
来处理ASCII字符(不适用于EBCDIC)。