0

这个问题与在 C 中制作一个数组来保存字符数组的数组有关

从那里借用代码,我有一些看起来像这样的东西(感谢 luser droog 的漂亮示例代码):

enum { BUFSZ = 50 };
enum { STRVSZ = 40 };
enum { STRVVSZ = 20 };
char buf[BUFSZ + 1];
char *strv[STRVSZ + 1];
char **strvv[STRVVSZ + 1];

int j;
int i;

while(1){
    fgets(buf, BUFSZ, infile);

    i = 0;
    strv[i] = strdup(buf);
    strv[i+1] = NULL;

    j = 0;
    strvv[j] = calloc(i+1, sizeof *strvv[j]); // assuming i is the count of elements 
    memcpy(strvv[j], strv, i * sizeof *strvv[j]);
    j++;
}

这可能不会马上跑出去,但它说明了与我正在运行的类似的东西。基本上,strv 的内容需要在每次循环迭代后存储在 strvv 中,并且 strv 根据用户输入随时间变化。

使用 calloc 和 memcpy 应该会导致 strvv 在循环的每次迭代中维护 strv 的副本,而与 strv 中的值无关。但是,当我打印出 strvv 的内容时,它会为每个条目打印出相同的字符串,这意味着当前的方法仍在移动指针,而不是在每个 strvv 条目中复制 strv。

我完全不确定为什么会发生这种情况或如何解决它。memcpy 应该制作 strv 中的指针指向 =/ 的字节级副本。

4

1 回答 1

1

这更接近我之前试图提出的建议。

enum { BUFSZ = 50 };
enum { STRVSZ = 40 };
enum { STRVVSZ = 20 };
char buf[BUFSZ + 1];
char *strv[STRVSZ + 1];
char **strvv[STRVVSZ + 1];

int j; // indexes strv slices in strvv
int i; // indexes strings (char *s) in strv

j = 0; // j is index into strvv

while(!feof(infile)) {

    i = 0; // i is index into strv
    while(i < STRVSZ){
        fgets(buf, BUFSZ, infile);
        if (strcmp(buf,"END")==0) break; // end of a set

        strv[i] = strdup(buf);
        strv[i+1] = NULL;
        i++;
    }  // i is count of strv

    // copy strv into strvv
    strvv[j] = calloc(i+1, sizeof *strvv[j]); // assuming i is the count of elements 
    memcpy(strvv[j], strv, (i+1) * sizeof *strvv[j]);  // i+1 to copy the NULL pointer
    j++; // index next element in strvv and a count of strvv

} // j is count of sets in strvv

感觉还是一团糟。

功能。它需要更小、定义明确的功能。这里的变量都是更有意义的占位符。

于 2013-04-19T02:23:29.043 回答