C ++生成下一个键

时间:2011-01-28 01:22:45

标签: c++ string

const int SIZE = 3;
const char val[SIZE] = {'3', 'z', '7'};

const string& next(){
   static string ret = "0";
   static unsigned i = 0;
   static unsigned j = 0;
   s[j] = val[i];
   i++;

   return ret;

//...
}

每次调用next时,我希望它返回下一个字符串键,例如:

3
z
7
33
3z
37
z3
zz
z7
73
7z
77
333
33z
...

val []可以是任何值的任何大小。我的实现是错误的和不完整的,我无法绕过它。有人可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

const string& next(){
    static int pos = 1;
    static string s;
    s.clear();
    int n = pos++;
    while (n){
        s += val[(n-1) % SIZE];
        // use s = val[(n-1] % SIZE] + s; for inverse order.
        n = (n-1) / SIZE;
    };
    return s;
};

答案 1 :(得分:0)

就缠绕它的头部而言,你可以像想要增加一个数字一样思考它。增加最右边的值,但是如果超过结束,则将其设置回第一个值并增加下一列等,然后在必要时在前面添加额外的值。

#include <iostream>
#include <string>

const int n = 3;
const char val[n] = {'3', 'z', '7'};

const std::string& next()
{
    static std::string ret;
    if (ret.empty()) return ret = val[0];
    for (int i = ret.length() - 1; i >= 0; --i)
        if (ret[i] == val[n - 1])
        {
            // carry situation, reset this column & will increment next...
            ret[i] = val[0];
        }
        else
        {
            // found existing column with room to increment...
            ret[i] = strchr(val, ret[i])[1];
            return ret;
        }

    return ret = val[0] + ret; // add an extra column at left...
}

int main()
{
    for (int i = 0; i < 20; ++i)
        std::cout << next() << ' ';
    std::cout << '\n';
}

答案 2 :(得分:0)

您希望格式化基数3中的数字,并为数字添加不常见的符号。您可以使用itoa转换为base 3,然后通过将0更改为3,1到z和2到7来修改字符串。