字符串副本不适用于旋转字符串数组的数组
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]));
}
我有一个字符串数组,用 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]));
}