Что мы не используем двойной массив? - PullRequest
3 голосов
/ 13 апреля 2020

Я сталкивался с этим кодом

Ввод:

3
0.1227...
0.517611738...
0.7341231223444344389923899277... 
int N; 
char x[110]; 
int main() {
scanf("%d\n", &N);
while (N--) { 
scanf("0.%[0-9]...\n", &x); 
printf("the digits are 0.%s\n", x);

И я не могу понять несколько вещей:

1.Почему мы не используем двойной массив (так как входное значение двойное)?

2. Какую цель эти три точки ... в scanf после [0-9] служат? и

3.Почему мы не используем какой-либо спецификатор формата (в данном случае d) после [0-9] в scanf?

1 Ответ

9 голосов
/ 13 апреля 2020

Почему мы не используем двойной массив (так как входное значение двойное)?

Входные данные могут быть записаны как 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;
}
...