Читайте документацию по scanf. Он возвращает количество отсканированных элементов, и вы должны их хранить и проверять. Он может возвращать -1 при отказе (и это рассматривается как истинное значение), а затем не потребляет никаких данных. Спецификатор преобразования %n
часто полезен и недостаточно известен.
Так код
while(f < 31 && scanf("%d",&days1[f])>0) f++;
Но вы, вероятно, нужно, чтобы закончить первую серию с чем-то, что делает scanf
неудачу, а затем вам нужно, чтобы пропустить что-то. Вы должны определить и документировать соглашение об этом. Давайте представим, что вы наберете точкой с запятой ;
то вы код возможно:
f=0;
while(f < 31 && scanf("%d",&days1[f])>0) f++;
if (getchar() != ';') exit(EXIT_FAILURE);
f=0;
while(f < 31 && scanf("%d",&days2[f])>0) f++;
Я не уверен, что выше работа. Возможно, вам придется заботиться о пробелах или пустых строках. Вы можете прочитать каждую отдельную строку с fgets
или getline
и проанализировать каждую строку (используя sscanf
или strtol
).
На самом деле, я бы рекомендовал объявить достаточно большой буфер char buf[256];
, используйте fgets
читать единственную строку, содержащую все серии чисел, а затем разобрать эту строку, используя strtol
в цикле и заботясь о конечном указателю уделяется strtol
,
Вам необходимо задокументировать формат ввода, по крайней мере, в виде комментариев. Для этого вы можете использовать нотацию EBNF, а затем использовать стандартные методы parsing.
Конечно, вы должны скомпилировать все предупреждения и информацию об отладке (например, gcc -Wall -Wextra -g
при использовании GCC ...). Затем научитесь использовать отладчик (например, gdb
). Это необходимый навык.
Я только что протестировал его, и он даже не вышел из первого цикла, я просто могу ввести номера. – moffeltje
@moffeltje: То же самое здесь. – WedaPashi
попытайтесь ввести письмо вместо числа, оно выйдет – Val