Почему мы не используем двойной массив (так как входное значение двойное)?
Входные данные могут быть записаны как double
, а также символы. double
имеет предел значащих цифр. По какой-то причине ваш код хранит ввод в виде символов.
Какую цель эти три точки ... в scanf после [0-9] служат?
Три точки не служат какой-либо цели, кроме случаев, когда они являются частью ввода, после чего до следующей scanf
удаляется до трех точек. Вход 0,123
будет успешно отсканирован, как и 0.123...
. Если вход был 0.123abc
, abc
останется во входном потоке и вызовет проблемы в текущем коде.
Почему мы не используем спецификатор формата (в данном случае d) после [0-9] в scanf?
%[]
- спецификатор формата. Иногда называется скансет. Здесь хранятся персонажи. Может быть включительно или эксклюзивно.
%[0-9]
включено. Он будет принимать цифры. Он остановится на первом символе, который не является ди git.
A d
, после спецификатора будет вести себя так же, как точки. При 0.%109%[0-9]d
вход 0.123down
будет сканировать 0.123d
, оставляя own
во входном потоке, чтобы впоследствии вызвать проблемы в текущем коде.
Хорошей практикой является предоставление ограничения массива для предотвращения записи слишком много символов в массиве. для [110] используйте %109[0-9]
. Это позволяет один символ для завершающего нуля.
РЕДАКТИРОВАТЬ: пример кода
#include <stdio.h>
int N;
char x[110];
int main ( void) {
scanf("%d\n", &N);
while (N--) {
scanf(" 0.%109[0-9]...", x);
printf("the digits are 0.%s\n", x);
}
return 0;
}