可以让一个函数接受一个设置长度的字符数组吗?
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()
代替比较。
我正在尝试为我的 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()
代替比较。