c - 写在一个字符串上,但每 k 个字节

c - Write on a string but every k bytes

练习给了我一个 main 以这种方式打印字符串列表,也就是说,知道每个 MAX_NAME_LENGTH 都有一个有意义的名称并打印它。

#define MAX_NAME_LENGTH 32
#define DIM 4

int main(int argc, char *argv[]) {  
    char *list=calloc((MAX_NAME_LENGTH+1),sizeof(char));
    edit(&list);

    int len=strlen(list);
    printf("strlen list %ld\n",strlen(list));

    int nusers = len / (MAX_NAME_LENGTH+1);
    int p=0;

    printf("user online list:\n");
    for(int i=0,p=0;i<nusers; ++i, p+=(MAX_NAME_LENGTH+1)) {
        printf(" %s\n", &list[p]);
    }

    free(list);

    return 0;
}

我不能做的是正确填写字符串,即使字符串分配长度DIM*(MAX_NAME_LENGTH+1),当我要复制时长度小于MAX_NAME_LENGTH,怎么做?

这是我用来填充字符串列表的编辑函数

int edit(char** list){
    int i;
    char *array[DIM];
    int offset=0;
    for(i=0;i<DIM;i++){
        array[i]=calloc((MAX_NAME_LENGTH+1),sizeof(char));
    }

    strncpy(array[0],"try",MAX_NAME_LENGTH+1);
    printf("array: %s len %ld\n",array[0],strlen(array[0]));

    strncpy(array[1],"test",MAX_NAME_LENGTH+1);
    printf("array: %s len %ld\n",array[1],strlen(array[1]));

    strncpy(array[2],"test5",MAX_NAME_LENGTH+1);
    printf("array: %s len %ld\n",array[2],strlen(array[2]));

    strncpy(array[3],"testone",MAX_NAME_LENGTH+1);
    printf("array: %s len %ld\n",array[3],strlen(array[3]));

    *list=realloc(*list,DIM*(MAX_NAME_LENGTH+1));
    for(i=0;i<DIM;i++){
        strncpy(*list+offset,array[i],MAX_NAME_LENGTH+1);
        offset=offset+MAX_NAME_LENGTH+1;
        printf("list: %s len %ld\n",*list,strlen(*list));
    }


    return 0;
}

printf() 总是只打印 *list 中的第一个单词。您还需要在此处添加 offset

printf("list: %s len %ld\n",*list+offset,strlen(*list+offset));

您正在按照您期望的方式填充数组(我不太愿意称它为字符串,因为它实际上包含 4 个)。当您尝试在 main:

中获取它的长度时,问题就来了
int len=strlen(list);

strlen 函数对字符进行计数,直到出现第一个空字节。然而,您在这里拥有的是 4 个字符串,这些字符串嵌入在一个数组中,空字节将它们分隔开。所以 strlen 在第一个空字节处停止计数。

为了说明,这里是您的数组包含内容的简化版本:

-------------------------------------------------------------
| 't' | 'r' | 'y' |  0  |  0  | 't' | 'e' | 's' | 't' |  0  |  ...
-------------------------------------------------------------

数组的实际长度是函数中 malloc 的长度,所以改用它:

int len=DIM*(MAX_NAME_LENGTH+1);

您也没有在 edit 中正确打印:

offset=offset+MAX_NAME_LENGTH+1;
printf("list: %s len %ld\n",*list,strlen(*list));

你在复制字符串时使用了offset,所以打印时也在这里使用它。

printf("list: %s len %ld\n",*list+offset,strlen(*list+offset));
offset=offset+MAX_NAME_LENGTH+1;

编码时,越简单越好:

建议以下代码:

#include <stdio.h>

#define MAX_NAME_LENGTH 32
#define DIM 4

int main( void ) 
{  
    char list[ DIM ][ MAX_NAME_LENGTH +1 ] = 
    {
        "try",
        "test",
        "test5",
        "testone"
    };

    puts("user online list:\n");
    for( size_t i=0; i<DIM; ++i ) 
    {
        printf(" %s\n", list[i]);
    }

    return 0;
}

产生以下输出:

user online list:

 try
 test
 test5
 testone