У меня есть файл с числом вроде 100000. Есть ли способ сохранить каждую цифру в массиве? Например, я делаю array[100]
и хочу array[0] = 1
, array[1] = 0
, array[2] = 0
и т. д. Я просмотрел это, но из того, что я понял, если я использую массив символов, он принимает его как единое целое.
fscanf число и сохранить каждую цифру в массиве
Ответы (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
В первом примере, почему вы вычитаете
'0'
?
- person Amit; 26.04.2011
@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
Извините, но я все еще в замешательстве. Вы сохраняете символ, который вы читаете, в переменной char
c
, верно? Итак, вы читаете цифру 1
, сохраняете ее как символ в c
, а затем сохраняете c - 0
в массив целых чисел. Не могли бы вы вычесть 0
из любого прочитанного integer
? Например, что, если файл имеет 14122
. Будет ли этот подход по-прежнему работать?
- person Amit; 26.04.2011
@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
+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