字符表中的查找索引值

时间:2019-05-24 16:22:58

标签: c++ string algorithm

我试图通过遍历数组来查找索引号,但是我不能使用循环。可能吗?

我已经附加了代码来循环执行此操作。

#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;
}

是否可以不循环地做同样的事情?

2 个答案:

答案 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)。