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
练习给了我一个 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