字符串副本不适用于旋转字符串数组的数组

String copy not working for rotating an array of array of string

我有一个字符串数组,用 C 写成一个全局变量:

static char strList[10][20][30]; /* Used 10, 20, 30 for easier comunication */

这将存储这样结构的东西(实际内容会有所不同)

[["word1", "word2", ..., "word20" ],  /* line 1 */
["ward1", "wsrd2", ..., "wdrd20" ],   /* line 2 */
...
["wasd1", "qwer2", ..., "uijk20" ]]   /* line 10 */

我想要一个旋转函数,将第 1 行移动到第 2 行,将第 2 行移动到第 3 行...并丢弃第 10 行。我是这样写的:

void rotateList(){
    int i, j;
    
    for(j = 10-2; j >0; j--){
        for(i = 0; i < 20; i++){
            strcpy(strList[j+1][i], strList[j][i]); 
            /* Copy lower index into higher ones? */
        }
        strcpy(strList[j+1][i+1], "[=12=]");
    }
}

能编译运行,但好像不是copy。第 1 行的内容没有移到第 2 行,列表反而变成空的。

可能出了什么问题? 谢谢。

循环不正确:您没有在末尾重置第一行,而是在每次迭代时访问超出当前行末尾的字符串。

这是修改后的版本:

#include <string.h>

static char strList[DIM1][DIM2][DIM3];

void rotateList() {
    for (size_t j = DIM1; j --> 1; ) {
        for (size_t i = 0; i < DIM2; i++) {
            strcpy(strList[j][i], strList[j - 1][i]); 
        }
    }
    /* reset the first row */
    for (size_t i = 0; i < DIM2; i++) {
        strList[0][i][0] = '[=10=]';
    }
}

请注意,使用大量块副本可能会获得更好的性能:

void rotateList() {
    memmove(strList[1][0], strList[0][0], sizeof(strList) - sizeof(strList[0]));
    memset(strList[0][0], 0, sizeof(strList[0]));
}