fscanf число и сохранить каждую цифру в массиве

У меня есть файл с числом вроде 100000. Есть ли способ сохранить каждую цифру в массиве? Например, я делаю array[100] и хочу array[0] = 1, array[1] = 0, array[2] = 0 и т. д. Я просмотрел это, но из того, что я понял, если я использую массив символов, он принимает его как единое целое.


person user703269    schedule 25.04.2011    source источник


Ответы (3)


Я бы, наверное, не стал использовать fscanf() для этого:

while ((c = fgetc(fp)) != EOF && isdigit(c))
    array[i++] = c - '0';

Если вы должны использовать fscanf(), то:

int i = 0;
int v;
while (fscanf(fp, "%1d", &v) == 1)
{
    assert(v >= 0 && v <= 9);
    array[i++] = v;
}

1 в строке формата ограничивает целое число одной цифрой. Вы должны передать int *, если используете %1d. Если в вашей библиотеке есть поддержка C99, вы можете использовать:

int i = 0;
while (fscanf(fp, "%1hhd", &array[i++]) == 1)
    ;

Модификатор длины hh указывает, что указатель является указателем на char (очень короткое целое), а не на int.

person Jonathan Leffler    schedule 25.04.2011
comment
В первом примере, почему вы вычитаете '0'? - person Amit; 26.04.2011
comment
@Amit: потому что код символа для '0' обычно равен 48 (но это не гарантируется), а код символа для '9' обычно равен 57, поэтому для преобразования кода символа для цифры в число соответствующей цифре, вы вычитаете '0'. Это работает для любого набора кодов (EBCDIC, ISO/IEC 8859-x, Unicode и т. д.). Проблемы возникают только в том случае, если есть другие типы цифр, например цифры хинди (Unicode U+0660 ARABIC-INDIC DIGIT ZERO и т. д.). - person Jonathan Leffler; 26.04.2011
comment
Извините, но я все еще в замешательстве. Вы сохраняете символ, который вы читаете, в переменной char c, верно? Итак, вы читаете цифру 1, сохраняете ее как символ в c, а затем сохраняете c - 0 в массив целых чисел. Не могли бы вы вычесть 0 из любого прочитанного integer? Например, что, если файл имеет 14122. Будет ли этот подход по-прежнему работать? - person Amit; 26.04.2011
comment
@Amit: printf("%c %d\n", '0', '0');, скорее всего, напечатает 0 48. Итак, считывая один символ в переменную c, если символ '0' (обратите внимание на одинарные кавычки), сохраненное значение равно (вероятно) 48. Чтобы преобразовать это в 0 (обратите внимание на отсутствие кавычек), мы можем вычесть '0'; такое же вычитание из '1' даст 1, а из '2' даст 2 и т. д. Таким образом, каждая прочитанная цифра будет преобразована в число. При обработке как символ 0 может рассматриваться как контроль-@, 1 как контроль-A, 2 как контроль-B и т. д., или 0 как NUL, 1 как SOH, 2 как STX и т. д. Обратите внимание, что '0' != 0; это очень важно. - person Jonathan Leffler; 26.04.2011
comment
+1 @Jonathan Leffler: Теперь я понимаю, большое спасибо, это проясняет ситуацию. Все еще C нуб :/ - person Amit; 26.04.2011

Хранится ли число как буквальное «100000» или как его двоичное представление? если это буквальное «100000», просто прочитайте его в строку, которая уже является массивом символов.

person Marc B    schedule 25.04.2011

Поскольку вы используете fscanf для чтения ввода в массив символов, вы можете перебирать этот массив и применять atoi к каждому элементу и помещать вывод (целое число) в свой массив int.

person Thebigcheeze    schedule 25.04.2011