循环中的strncpy()从字符串数组中删除所有值

时间:2019-05-20 12:06:14

标签: c strncpy

我有以下降序插入排序算法。我正在尝试同时对名称数组和数字数组进行排序。在执行此操作之前,我有两个看起来像这样的数组:

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;
    }
}

1 个答案:

答案 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;
    }
}