c - записать в строку, но каждые k байтов - PullRequest
0 голосов
/ 13 февраля 2019

упражнение дает мне основную функцию, которая печатает список строк таким образом, то есть знает, что каждое 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;
}

Ответы [ 3 ]

0 голосов
/ 13 февраля 2019

Вы заполняете массив (стесняюсь называть его строкой, потому что он на самом деле содержит 4) так, как вы ожидаете.Проблема возникает, когда вы пытаетесь получить его длину в main:

int len=strlen(list);

Функция strlen считает символы до первого нулевого байта.Однако у вас есть 4 строки, встроенные в массив с нулевыми байтами, разделяющими их.Таким образом, strlen прекращает считать на первом нулевом байте.

Для иллюстрации приведу упрощенную версию того, что содержит ваш массив:

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

Фактическая длина массива - это то, что былоmalloc'ed в функции, поэтому используйте это вместо:

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;
0 голосов
/ 15 февраля 2019

при кодировании просто всегда лучше:

Предложите следующий код:

#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
0 голосов
/ 13 февраля 2019

printf() всегда печатает только первое слово в *list.Вам также нужно добавить offset:

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