Неправильный вывод atoi () в некоторых частях массива - PullRequest
0 голосов
/ 25 октября 2019

Я читаю входной файл и записываю его в двумерный целочисленный массив. Все числа в файле имеют два символа.

Работает хорошо, но во всех элементах [48] - [57] целые числа имеют избыточную цифру (например, 30, 871, 447 вместо 3, 87, 44). Та же проблема с strtol (). Шестнадцатеричные коды входного файла выглядят абсолютно нормально в этих частях.

for (int a = 0; a < d; a++)
{
    for (int b = 0; b < d; b++)
    {
        //read two chars
        uint16_t num;
        fread(&num, sizeof(char) * 2, 1, inptr);

        //convert to int and put to the array (it makes wrong int in 48 <= b <= 57)
        arr[a][b] = atoi((char*)&num);

        //skip space or line break in the input file
        fseek(inptr, sizeof(char), SEEK_CUR);
    }
}

В чем проблема? Почему только [48] - [57] работают неправильно?

1 Ответ

0 голосов
/ 25 октября 2019

Спасибо за все комментарии, особенно для тех, кто упоминает \0, необходимый для atoi.

Использование char str[3] вместо uint16_t устраняет проблему и позволяет правильно преобразовать все числа.

for (int a = 0; a < d; a++)
{
    for (int b = 0; b < d; b++)
    { 
        char str[3];
        str[2] = '\0';
        fread(&str, 2, 1, inptr);
        arr[a][b] = atoi(str);
        fseek(inptr, 1, SEEK_CUR);
    }
}
...