средства ввода\вывода

297
06 августа 2017, 08:19

Товарищи,ситуация такая : у меня есть файл json в котором описана структура. Функция ReadEntrants читает файл и возвращает строку wchar_t. Далее функция ParseEntrants принимает строку которую я считал из файла и записывает данные в поля структуры.Так же есть функция которая выводит структуру в файл и оформляет в виде таблицы ( скрин приложен). как видно с полем Name все хорошо,а вот в поле Phone всегда в конец добавляется мусор вроде символов 'd' или 'Z'. в чем ошибка ?

struct Entrant
{
    wchar_t Name[30];
    wchar_t Phone[10];
    int Estimates[4];
};
wchar_t *StrToWideStr(char *str)// делает из char wchar_t
{
    size_t length = StrLength(str);
    size_t converted = 0;
    wchar_t *newArr = new wchar_t[length + 1];
    converted = mbstowcs(newArr, str, length + 1);
    if (converted != length)
        return nullptr;
    return newArr;
}
wchar_t *SkipUnnecessarySymbols(wchar_t *wstr)// передвигает указатель на следующий символ после ':'
{
    int index = 0;
    while (*wstr)
    {
        if (wstr[index] == ':')
            return wstr + index+1;
        ++index;
    }
    return nullptr;
 }
char *ReadEntrants(char *filePath) // считываю структуры из файла в строку    char
    {
        FILE *ptrFile = fopen(filePath, "rt");
        if (ptrFile == nullptr)
            return nullptr;
        fseek(ptrFile, 0, SEEK_END); // GetFileSize
        long fileSize = ftell(ptrFile);
        rewind(ptrFile);
        char *buffer = new char[fileSize+1];
        auto readed = fread(buffer, 1, fileSize, ptrFile);
        buffer[readed] = 0;
        fclose(ptrFile);
       return buffer;
   }
void ParseEntrants(Entrant *arrOfstruct, wchar_t *str, int i)
{
    for (int k = 0; k < 4; ++k)
    {
        swscanf(str, L"%d", &arrOfstruct[i].Estimates[k]);
        if (k == 3)
            break;
        str = SearchDilim(str);
    }
}
Entrant *ParseEntrants(wchar_t *str, int &count)
{   
    count = CountOfSructs(str); //считает кол-во структур в строке wchar_t
    Entrant *arrOfstruct = new Entrant[count];
    for (int numberOfStruct = 0; numberOfStruct < count; ++numberOfStruct)
    {
        str = SkipUnnecessarySymbols(str) + 1;
        swscanf(str, L"%[^\"]s", &arrOfstruct[numberOfStruct].Name);
        str = SkipUnnecessarySymbols(str);
        swscanf(str, L"%[0-9]s", &arrOfstruct[numberOfStruct].Phone);
        str = SkipUnnecessarySymbols(str) + 1;
        ParseEntrants(arrOfstruct, str, numberOfStruct);
    }
   return arrOfstruct;
}
Answer 1

В массив wchar_t Phone[10] для телефонных записей записывается 10-значный номер телефона. Это не оставляет места для терминального нуля и при выводе приводит к появлению мусора. Решение заключается в увеличении размерности массива до 11 элементов.

READ ALSO
Творческое заимствование?

Творческое заимствование?

Добрый день, у меня проблема не могу вытащить слайдер товаров из этой бутcтреповской темыПереношу в проект css и скрипты master-slider, но все равно...

479
mysql правильное хранение платежей

mysql правильное хранение платежей

Возник следующий вопрос: сервис продает определенные услугиУ каждой услуги есть несколько цен со своим сроком действия

333
MariaDB + Galera: запросы зависают в статусе query end

MariaDB + Galera: запросы зависают в статусе query end

Всем привет! Есть кластер (2 ноды + 1 арбитратор)Запросы на него идут через maxscale proxy, настроенную таким образом, чтобы все запросы (и чтения и записи)...

297
В чем может быть ошибка mysql запрос?

В чем может быть ошибка mysql запрос?

Пытаюсь достать продукт по хешу url

347