首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >字符串复制不适用于旋转字符串数组的数组

字符串复制不适用于旋转字符串数组的数组
EN

Stack Overflow用户
提问于 2021-03-12 06:14:14
回答 1查看 29关注 0票数 1

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

代码语言:javascript
运行
复制
static char strList[10][20][30]; /* Used 10, 20, 30 for easier comunication */

它将存储像这样的结构(实际内容视情况而定)

代码语言:javascript
运行
复制
[["word1", "word2", ..., "word20" ],  /* line 1 */
["ward1", "wsrd2", ..., "wdrd20" ],   /* line 2 */
...
["wasd1", "qwer2", ..., "uijk20" ]]   /* line 10 */

我想要有一个旋转函数,将第一行移动到第二行,第二行移动到第三行。然后丢弃第10行。我是这样写的:

代码语言:javascript
运行
复制
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], "\0");
    }
}

它编译并运行,但似乎没有复制。第1行中的内容没有移动到第2行,而是列表变为空。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-12 06:23:55

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

以下是修改后的版本:

代码语言:javascript
运行
复制
#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] = '\0';
    }
}

请注意,使用大量数据块复制可能会获得更好的性能:

代码语言:javascript
运行
复制
void rotateList() {
    memmove(strList[1][0], strList[0][0], sizeof(strList) - sizeof(strList[0]));
    memset(strList[0][0], 0, sizeof(strList[0]));
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66591335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档