неправильный вывод, не могу понять, почему C - PullRequest
0 голосов
/ 13 ноября 2018

Я новичок в программировании на C, и я создал функцию, которая получает строку "HodHasharon,frozenYogurt,100".Функция разрезает строку на 3 части, где каждая часть является полем моей City структуры.

Я хочу поместить "HodHasharon" в Город pcity.name (название города), "frozenYogurt" вpcity.popularFood (популярная еда) и количество жителей (100) в pcity.residents.

Когда я отлаживаю вывод в моей функции, вывод правильный, но когда я печатаю из main.c Iполучил объединенную строку.

Например, когда я печатаю pcity.name, я получаю "HodHashafrozenYod" вместо "HodHasharon", но если я выполняю printf в своей функции printf-> name, я получаю правильный вывод "HodHasharon"

Что я делаю не так?

структура города:

typedef struct City
{
    char *name;
    char * popluarFood;
    int numberOfPeople;

} City;

функция:

City * cutCityData (char *singleLine)
{
    City* pcity=(City*)malloc(sizeof(City));
    int firstIndex=1;
    int endIndex=1;
    int checkItarion=0;
    while(endIndex<strlen(singleLine))
    {//while
        while (singleLine[endIndex] != ',')
        {//while2
            endIndex++;
        }//while2
        checkItarion++;
        char cityDetails[endIndex - firstIndex +1];
        memcpy(cityDetails,&singleLine[firstIndex], endIndex);
        cityDetails[endIndex - firstIndex] = '\0';
        if (checkItarion == 1) {
            pcity->name = (char *) malloc(cityDetails);
            strcpy(&(pcity->name), cityDetails);
            endIndex++;
            firstIndex = endIndex;
        }
        if (checkItarion == 2) {
            pcity->popluarFood = (char *) malloc(cityDetails);
            strcpy(&(pcity->popluarFood), cityDetails);
            endIndex++;
            firstIndex=endIndex;
            break;
        }
    }//while
    char cityDetails[strlen(singleLine) - firstIndex + 1];
    memcpy(cityDetails, &singleLine[firstIndex], sizeof(singleLine-1));
    int resdints=atoi(cityDetails);
    pcity->numberOfPeople=resdints;
    return pcity;
    }

из основного:

City* pCity=cutCityData(singLine);
printf("%s\n", &(pCity->name));

1 Ответ

0 голосов
/ 13 ноября 2018

&(pcity->name) - адрес переменной указателя.Вы хотите скопировать строку в память, на которую она указывает, а не скопировать указатель.Поэтому измените:

strcpy(&(pcity->name), cityDetails);

на

strcpy(pcity->name, cityDetails);

Вы также приводите неправильный аргумент для malloc().cityDetails - это массив, но аргумент должен быть числом байтов, которое вы хотите выделить.Поэтому измените

pcity->name = (char *) malloc(cityDetails);

на:

pcity->name = malloc(strlen(cityDetails) + 1);

Эти изменения также необходимо выполнить для кода, который также заполняет pcity->popularFood.

Это неправильно:

memcpy(cityDetails, &singleLine[firstIndex], sizeof(singleLine-1));

singleLine - указатель, поэтому sizeof(singleLine-1) - это количество байтов в указателе, а не длина строки.Это должно быть:

memcpy(cityDetails, &singleLine[firstIndex], endIndex + 1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...