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