我有以下降序插入排序算法。我正在尝试同时对名称数组和数字数组进行排序。在执行此操作之前,我有两个看起来像这样的数组:
scores = [0,0,0,0,0,7]
names = [null,null,null,null,null,"James"]
执行完此操作后,我将得到两个看起来像这样的数组:
scores = [7,0,0,0,0,0]
names = [null,null,null,null,null,null]
由于某种原因,名称数组中的值已消失。预期的输出如下:
scores = [7,0,0,0,0,0]
names = ["James",null,null,null,null,null]
uint8_t scores[6];
uint8_t names[6][13];
static void sort_in_highscore(void) {
uint8_t k, temp;
int8_t j;
for (k=1; k < 6; k++) {
temp = scores[k];
j = k - 1;
while (j >= 0 && temp > scores[j]) {
scores[j+1] = scores[j];
strncpy((char*)names[j+1], (const char*)names[j], 12);
j--;
}
scores[j+1] = temp;
}
}
答案 0 :(得分:1)
除了注释中提到的其他问题外,您还忘记了对字符串值使用临时变量,就像对数字值使用temp
一样。这就是为什么最后一个字符串值"James"
丢失,或者实际上每个与您要在当前循环周期中插入的数字分数names[k]
对应的字符串值scores[k]
丢失的原因。
修改后的代码(未经测试):
uint8_t scores[6];
uint8_t names[6][13];
static void sort_in_highscore(void) {
uint8_t k, temp;
int8_t j;
char tempname[13]; /* temporary string value */
for (k=1; k < 6; k++) {
temp = scores[k];
strncpy(tempname, names[k], sizeof(tempname)-1); /* save last string */
tempname[sizeof(tempname)-1] = '\0';
j = k - 1;
while (j >= 0 && temp > scores[j]) {
scores[j+1] = scores[j];
strncpy((char*)names[j+1], (const char*)names[j], 12);
names[j+1][sizeof(names[j+1])-1] = '\0';
j--;
}
scores[j+1] = temp;
strncpy(names[j+1], tempname, sizeof(names[j+1])-1); /* use saved string value */
names[j+1][sizeof(names[j+1])-1] = '\0';
}
}
如果您使用包含数字和字符串的结构数组而不是两个单独的数组,则实现会更容易。
带有struct
(也未经测试)的示例:
struct score {
uint8_t score;
uint8_t name[13];
}
struct score scores[6];
static void sort_in_highscore(void) {
uint8_t k;
struct score temp;
int8_t j;
for (k=1; k < 6; k++) {
temp = scores[k];
j = k - 1;
while (j >= 0 && temp.score > scores[j].score) {
scores[j+1] = scores[j];
j--;
}
scores[j+1] = temp;
}
}