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

时间:2019-02-13 18:11:45

标签: c string pointers calloc

该练习为我提供了一个主目录,该主目录以这种方式打印字符串列表,也就是说,知道每个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,该怎么做? / p>

这是我用来填充字符串列表的编辑功能

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;
}

3 个答案:

答案 0 :(得分:2)

您正在按您期望的方式填充数组(我不愿意将其称为字符串,因为它实际上包含4)。当您尝试在main中获取其长度时就会出现问题:

int len=strlen(list);

strlen函数对字符进行计数,直到第一个空字节为止。但是,您这里拥有的是将4个字符串嵌入到数组中,其中空字节将它们分开。因此strlen在第一个空字节处停止计数。

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

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

数组的实际长度是函数中已分配的长度,请改用该长度:

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;

答案 1 :(得分:0)

printf()始终仅打印*list中的第一个单词。您还需要在其中添加offset

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

答案 2 :(得分:0)

编码时,简单总是更好:

建议以下代码:

#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