Что ж, непосредственная проблема заключается в том, что вы не выделили памяти для readFirst
, чтобы указать на . Когда вы пишете readFirst[counter] = c
, вы пытаетесь присвоить значение c
некоторой случайной ячейке памяти, которая может вам принадлежать или не принадлежать (отсюда и segfaults).
Если вы знаете, насколько большим массив должен быть раньше времени, вы должны объявить readFirst
как
char readFirst[SIZE];
Для представления десятичной цифры в среднем требуется примерно 3,3 бита; округлите его до 3, и вы можете измерить размер вашего массива как битовую ширину int
, деленную на 3 плюс 2 для знака и 0 в качестве разделителя. Таким образом, 32-битному int потребуется массив из 9 + 2 = 11 символов. 64-битное целочисленное значение потребует 22 + 2 = 24.
Но это все вызывает другой вопрос; Вам нужно , чтобы прочитать ввод по одному символу за раз, а затем преобразовать в целочисленное значение? Если входной файл представляет собой просто текстовые представления целых чисел, вы можете обойти весь этот беспорядок и просто использовать fscanf
со спецификатором преобразования %d
(хотя это имеет свой собственный набор проблем).
В качестве альтернативы, вы можете использовать fgets
для одновременного чтения всей текстовой строки и преобразования текста с использованием strtol
(atoi
не дает такой же возможности обработки ошибок, как strtol
).