Первый столбец напечатан как (0, 0)
, потому что atoi
терпит неудачу. Пожалуйста, не используйте atoi
, а используйте strtol
, что позволит вам проверить, было ли успешным преобразование.
Причина atoi
терпит неудачу, потому что у вас есть дополнительный \n
характер, потому что с fgets(fgets(line, 2, fp);
вы читаете только один символ - потому что вы прошли 2 для размера буфера, и один элемент из буфера резервируется для \0
характера , Просто используйте достаточно большой буфер для чтения всей строки и передайте размер буфера.
Чтобы исправить другую ошибку, просто не используйте feof
. Скорее проверьте возвращаемое значение fgets
, чтобы узнать, сколько символов он читает из файла (или, если вы действительно хотите использовать feof
, выполните эту проверку после вызова fgets
).
while ( fgets(line, sizeof(line), fp) > 0)
{
char* end;
alive_row = strtol(&line[0], &end, 10);
// If the end points to the &line[0], then no
// characters were converted!
if(end == &line[0])
{
printf("strtol failed!\n");
return 0;
}
alive_column = strtol(&line[2], &end, 10);
// If the end points to the &line[2], then no
// characters were converted!
if(end == &line[2])
{
printf("strtol failed!\n");
return 0;
}
fprintf(stderr, "\n Cell: (%i)(%i)", alive_row, alive_column);
}
У нас есть чек &line[0] == end
, потому что второй аргумент, переданный strtol
является
Ссылка на объект типа полукокса *, значение которого задается с помощью функции к следующему символу ул после численная величина.
Если в строке не было числового значения, этот указатель укажет на начало строки, которую вы пытались преобразовать.
Если вы не знаете, если число цифр будет 1 или 2, или любой, вы все еще можете использовать strtol
, чтобы помочь вам здесь:
while ( fgets(line, sizeof(line), fp) > 0)
{
char* end;
char* tmp;
alive_row = strtol(&line[0], &end, 10);
// If the end points to the &line[0], then no
// characters were converted!
if(end == &line[0])
{
printf("strtol failed!\n");
return 0;
}
// If the previous strtol converted the first number
// end will point to the space character (the first character after the number).
// So, just pass
// end + 1 which should point to the second number
tmp = end + 1;
alive_column = strtol(tmp, &end, 10);
// If the end points to the tmp, then no
// characters were converted!
// (this is why we used this tmp to place end + 1 - we need to
// check for the success of the strtol).
if(end == tmp)
{
printf("strtol failed!\n");
return 0;
}
fprintf(stderr, "\n Cell: (%i)(%i)", alive_row, alive_column);
}
Первая колонка печатается как '(0, 0) ', потому что' atoi' терпит неудачу и он возвращает 0. Пожалуйста, не используйте 'atoi', а скорее используйте' strtol', который заставит вас включить, чтобы проверить, было ли преобразование успешным или нет. –