2015-03-03 34 views
0

我正在努力为我的Arduino游戏保留一个高分表,并且有以下方法来添加新的高分。问题是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(); 
} 
+2

'names [position] = name;':o使用strcpy。是的,你必须检查它 – deviantfan 2015-03-03 06:47:55

+0

为什么不使用'strlen'或其他函数来检查'name'的长度,如果它大于3,则请求再次输入它。 – 2015-03-03 06:48:38

+0

当你使用C++时,使用std :: string有什么问题? – 2015-03-03 06:53:12

回答

0

的问题是,存储为字符数组的c串不能被复制,由值作为参数传递,或者像内建的标量类型进行比较。

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

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

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()反而比较。