可以让一个函数接受一个设置长度的字符数组吗?

Possible to have a function take a char array of set length?

我正在尝试为我的 Arduino 游戏保持高分 table 并使用以下方法添加新的高分。问题是 names 被声明为 names[positions][4] 所以每个名字应该恰好是三个字符,否则谁知道会发生什么。我是否需要在函数中手动检查它,或者我可以在定义中强制执行它,还是我应该使用完全不同的方法?

void Highscore::add(uint8_t score, const char * name)
{
    position = Highscore::getPosition(score);

    if (position >= positions) {
        return;
    }

    for (int i=positions-1; i<=position; i--) {
        scores[i] = scores[i-1];
        names[i] = names[i-1];
    }

    scores[position] = score;
    names[position] = name;

    Highscore::save();
}

问题是存储为 char 数组的 c 字符串不能被复制,不能作为参数按值传递,也不能像内置标量类型那样进行比较。

解决方案 1: 使用 string 而不是 char[4]这是推荐的 C++ 方式。它们使用起来非常简单直观,并且没有真正的长度限制。但是如果你想限制它们的长度,你可以在用户输入时控制它。

解决方案2:如果不能使用解决方案1,由于嵌入式系统的技术限制,您可以使用structure/class来保存字符串。这是一个模板化版本:

template <int N>
struct fstring {
    char s[N+1];                // fixed string
    fstring() : s{} {}          // create an empty string
    fstring(const char*st) {    // convert a c-string to a fixed string
        strncpy(s, st, N);
        s[N] = 0;
    }
    bool operator== (fstring x) // compare two strings 
    {
        return strncmp(s, x.s, N) == 0;
    }
};
... 
fstring<3> names[10];  // ten fixed strings

解决方案 3: 您可以保持数据结构原样,但使用 strncpy() 代替赋值,使用 strcmp() 代替比较。