Он возвращает список, подобный массиву.
Вы делаете этот массив как пример
var el = getElementsByClassName("elem");
el = Array.prototype.slice.call(el); //this line
el[0].appendChild(otherElem);
Лучше читать полную строку, используя fgets()
, а затем проверять ее, а не пытаться разобрать «на лету» из входного потока.
Легче игнорировать недействительные input.
Используйте fgets()
, а затем просто strtol()
, чтобы преобразовать в число, это позволит легко увидеть, есть ли завершающие данные после номера.
Например:
char line[128];
while(fgets(line, sizeof line, stdin) != NULL)
{
char *eptr = NULL;
long v = strtol(line, &eptr, 10);
if(eptr == NULL || !isspace(*eptr))
{
printf("Invalid input: %s", line);
continue;
}
/* Put desired processing code here. */
}
Вызов scanf("%*[^\n]\n")
внутри цикла. Этого должно быть достаточно, чтобы отбросить все, что связано с кешем.
Но когда я вводил в него такие вещи, как abcd, цикл продолжался бы вечно и не останавливался для подсказки.
blockquote>Это потому, что если
scanf
встречает символ, который не сопоставить спецификатор преобразования, он оставляет его во входном потоке. В основном, то, что происходит, заключается в том, чтоscanf
считывает символa
из входного потока, определяет, что он не является допустимым совпадением для спецификатора преобразования%d
, а затем отталкивает его обратно на входной поток. В следующий раз через цикл он делает то же самое. И опять. И опять. И опять.
fflush
не является хорошим решением, поскольку он не определен для работы с входными потоками.Для ввода
"12ab"
,scanf
будет читать и преобразовывать"12"
, оставив"ab"
во входном потоке.Лучшим решением является чтение всего вашего ввода в виде текста, затем преобразование в числовые типы с использованием
strtol
(для целых значений) иstrtod
(для реальных значений). Например:char input[SIZE]; // assume SIZE is big enough for whatever input we get int value; if (fgets(input, sizeof input, stdin) != NULL) { char *chk; int tmp = (int) strtol(input, &chk, 10); if (isspace(*chk) || *chk == 0) value = tmp; else printf("%s is not a valid integer string\n", input); }
chk
указывает на первый символ во входном потоке, который не является десятичной цифрой. Если этот символ не является пробелом или терминатором 0, то входная строка не является допустимым целым числом. Это обнаружит и отклонит входы, такие как"12ab"
, а также"abcd"
.
scanf
является хорошим решением, если вы знаете, что ваш вход всегда будет правильно сформирован и хорошо выполнен. Если есть вероятность, что ваш вход не выполнен , используйтеfgets
и конвертируйте по мере необходимости.
Я предлагаю ввести ввод как строку и проверить для него числовые символы. Если ввод действителен, преобразуйте строку в int с помощью sscanf(str,"%d",&i);
или ошибки diplay.
Просто вызовите scanf ("% * [^\n]\n") внутри цикла и отбросит «кеш».
fflush
не определено для входных потоков. См. Стандарт C языка , раздел 7.19.5.2, параграф 2.
– John Bode
21 June 2012 в 15:11
if(eptr == NULL || !isspace(*eptr))
? при использовании кода, который вы даете, вводятся как «12 34», но их не должно быть. когда я вводил «1234», на что указывает eptr, и как насчет «12ab» и «12 34»? – Gnijuohz 21 June 2012 в 15:21