Проблемы с передачей данных в функцию - PullRequest
0 голосов
/ 05 февраля 2019

Написание программы на C, и я пытаюсь передать две переменные в функцию kstrextend.Имя, которое является словом или набором символов, которое хранится в значении kstring, и a, которое является числовым значением, но имя вообще не передается в функцию, насколько я могу судить, и я не могу понять, почему.Что-то хранится неправильно?Поскольку функция работает очень хорошо, я просто не могу правильно передать имя.

Объявление kstring и имени:

kstring name;
char kstring[50]; 

Typedef:

typedef struct
    {
        char *data;
        size_t length;
    } kstring;

Функция:

void kstrextend(kstring *strp, size_t nbytes)
{
    char *nwData;
    int lnth=strp->length;
    if(lnth < nbytes)
    {
        // new array allocate with large size and copy data to new array
        nwData = (char *)realloc(strp->data, nbytes);
        // call abort in case of error
        if(nwData == NULL)
        {
            abort();
        }
        //Making strp->data point to the new array
        strp->data = nwData;
        //Setting strp->length to the new size.
        strp->length = nbytes;
        for(int i = 0; i <= lnth; i++)
        {
            printf("\n %s",strp->data);
        }
        // filled with '\0' in remaining space of new array
        for (int lp = lnth; lp < nbytes; lp++)
        {
            strp->data[lp] = '\0';
            printf("\n %s", strp->data[lp]);
        }
    }
}

Часть основного:

    size_t a;
    char * k = kstring;
    printf("\n Enter number: ");
    scanf("%d", &a);
    name.data = (char*)calloc(sizeof(k), 1);
    strcpy(input, k);
    name.length= kstring_length;
    kstrextend(&name,a);

1 Ответ

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

Прежде всего, у вас есть неверное имя переменной kstring.Используйте что-то еще, например kstring_init, и присвойте ему значение.Я предполагаю, что вы хотите инициализировать переменную name типа kstring чем-то, а затем изменить ее длину.Так вот в чем дело.Затем определите константу типа char * и инициализируйте с ней длину и данные вашей kstring.Затем используйте realloc, чтобы расширить память указателя входным значением a, а не размером k.Это не имеет смысла.Поскольку размер k является размером указателя, который является постоянным.

В вашей функции: не используйте int, если вы передаете size_t.Используйте тот же тип данных, где вы делаете то же самое.

В цикле от 0 до lnth вы выводите одну и ту же строку lnth+1 раз, что не имеет смысла.Вы, вероятно, хотите вывести символы строки.Так что используйте %c и используйте индекс в массив символов и не устанавливайте <= lnth, но < lnth в качестве верхнего предела.Будьте осторожны с типами данных, если они подписаны и не подписаны!

Подсказка по дизайну: если у вас есть блок if, который оборачивает весь ваш код ... инвертируйте условие и просто выйдите, чтобы код был после блока if.

Будьте осторожны при работе с size_t и int, поскольку int подписано, а size_t нет, что может вызвать проблемы в операторах if.

Неиспользуйте abort а скорее exit.Вы не хотите, чтобы ваша программа аварийно прерывалась и дамп памяти.

Рабочая версия вашей программы:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

typedef struct
    {
        char *data;
        size_t length;
    } kstring;

kstring name;
char *kstring_init = "blabla";

void kstrextend(kstring *strp, size_t nbytes)
{
    char *nwData;

    size_t lnth = strp->length;

    if ((int) lnth >= (int) nbytes) {
        printf("Error, size already larger than requested size.\n");
        exit(-1);
    }

    // new array allocate with large size and copy data to new array
    nwData = realloc(strp->data, sizeof(char) * (int) nbytes);
    if(nwData == NULL)
    {
        printf("Error, realloc returned NULL\n");
        exit(-1);
    }

    //Making strp->data point to the new array
    strp->data = nwData;
    //Setting strp->length to the new size.
    strp->length = nbytes;

    for(int i = 0; i < lnth; i++)
    {
        printf("\n %c", strp->data[i]);
    }
    // filled with '\0' in remaining space of new array
    for (int lp = lnth; lp < (int) nbytes; lp++)
    {
        strp->data[lp] = '\0';
        printf("\n %c", strp->data[lp]);
    }
}

int main(void)
{
    size_t a;

    printf("\n Enter number: ");
    scanf("%d", &a);

    name.length = strlen(kstring_init) + 1;
    printf("Length of string is: %d\n", name.length);
    name.data = (char*)malloc(sizeof(char) * name.length);
    strcpy(name.data, kstring_init);

    printf("Old string: %s\n", name.data);
    printf("You want to reallocate %d bytes\n", a);

    kstrextend(&name, a);

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...