Для входного файла test1.in
, как показано в вопросе, вы задаете размер 8 и вводите 9 цифр.
Ваш код
while(token!=NULL){
for(int i=0;i<size;i++){
//printf("token is %s\n",token);
//numbers[i]=token;
sscanf(token,"%d",&numbers[i]);
//printf("Inserting %s to the array\n ",numbers[i]);
token=strtok(NULL," ");
}
}
будет вводить внешний while
цикл и обработка 8 чисел в первом запуске внутреннего цикла for
. Поскольку вы ввели 9 цифр, token
не будет NULL
, и внешний цикл будет повторяться и снова запускать внутренний цикл. Это частично перезапишет числа в массиве. После обработки 9-го числа в первом цикле token
станет NULL
, а во 2-м цикле sscanf
попытается использовать указатель NULL
, что может привести к ошибке сегментации.
Выследует объединить счетчик и проверку для NULL
в состоянии цикла. Я также рекомендую проверить возвращаемое значение sscanf
, потому что значение != 1
будет указывать на недопустимый ввод.
for(int i=0; (i<size) && (token!=NULL); i++) {
if(sscanf(token,"%d",&numbers[i]) != 1) {
/* invalid input */
break;
}
token=strtok(NULL," ");
}
Конечно, код, следующий за циклом, должен обрабатывать случай, когда цикл заканчивается на i < size
если присутствовало недостаточно значений.
Редактировать: дополнительные пояснения ниже
Примечание: проверка ошибок для scanf
не завершена. Он вернет 0
, если он не смог преобразовать целое число, но он также вернет 1
, если он преобразовал целое число и что-то последует за ним, например, для 123abc
он преобразует 123
и вернет 1
. Чтобы проверить, что может следовать за числом, вы можете добавить %c
преобразование и, если возвращаемые значения 2
, проверьте преобразованный символ. ('\n'
или '\r'
может быть в порядке.)
Я бы предпочел использовать strtol
в цикле для разбора чисел в str
.
Кстати: расчет размера для выделения str
неверен. sizeof int
- это размер внутреннего двоичного представления значения int
, которое во многих системах составляет 4 (4 байта = 32 бита). Это не имеет никакого отношения к тому, сколько символов необходимо для строкового представления числа. Для действительного числа -2147483648
требуется 11 символов.
(Вы можете использовать буфер str
, который слишком мал для всей строки, но достаточно велик для допустимого числа, если вы переместите оставшиеся данные вначинайте и добавляйте новые данные после вставки номера, пока не прочитаете завершающий символ новой строки.)