Это чистое решение для JavaScript без каких-либо библиотек или плагинов:
document.addEventListener('click', function (e) {
if (hasClass(e.target, 'bu')) {
// .bu clicked
// Do your thing
} else if (hasClass(e.target, 'test')) {
// .test clicked
// Do your other thing
}
}, false);
, где hasClass
-
function hasClass(elem, className) {
return elem.className.split(' ').indexOf(className) > -1;
}
Кредит относится к Dave и Sime Vidas
Использование более современных JS, hasClass
может быть реализовано как:
function hasClass(elem, className) {
return elem.classList.contains(className);
}
Функция scanf()
будет возвращать количество прочитанных элементов, поэтому в этом случае она будет возвращать 1 при каждом чтении целого числа и 0 при чтении символа, поэтому вам просто нужно проверить это возвращаемое значение. Имейте в виду, что после чтения символа он останется в буфере, поэтому, если вы снова воспользуетесь командой scanf()
, он снова будет читать символ и повторять ошибку. Чтобы избежать этого, вам нужно использовать символ с while(getchar() != '\n');
Имея это в виду, я изменил ваш код так, чтобы он работал правильно, выводя сообщение об ошибке, если вводится символ, и запрашивая новый int. [115 ]
for (int i = 1; i <= size; i++) {
printf("Introduce the value #%d of the list: ", i);
while (!scanf("%d", &list[i])) { //verifies the return of scanf
while(getchar() != '\n'); //consumes the character in case of error
printf("What you tried to introduce is a char\n");
printf("please introduce the value #%d of the list: ", i);
}
}
Как говорит @MFisherKDX, проверьте возвращаемое значение scanf
. Со страницы руководства scanf :
Эти функции возвращают количество входных элементов, успешно сопоставленных и назначенных, которое может быть меньше предусмотренного или даже равно нулю в случае ошибка раннего сопоставления.
Значение EOF возвращается, если достигнут конец ввода перед первым успешным преобразованием или ошибкой сопоставления. EOF также возвращается, если происходит ошибка чтения, и в этом случае устанавливается индикатор ошибки для потока (см. Ferror (3)), и устанавливается errno, обозначающий ошибку.
blockquote>Таким образом, захват возвращаемого значения
scanf
в переменнойint
и последующее сравнение этой переменной с1
(в вашем случае, потому что вы пытаетесь только прочитать 1 элемент) должны сказать вам, еслиscanf
успешно прочитал целочисленное значение.Однако, есть неприятная ловушка при использовании
scanf
, о которой вы должны знать. Если вы введетеn
в командной строке,scanf
завершится с ошибкой и вернет0
, но также не будет использовать введенный вами ввод. Это означает, что при следующем вызовеscanf
он будет читать тот же ввод (введенный вами символn
) и снова потерпит неудачу. И это будет продолжаться независимо от того, сколько раз вы звонитеscanf
. Меня всегда удивляет, что преподаватели информатики продолжают преподаватьscanf
студентам, учитывая не только эту потенциальную ловушку, но и несколько других ловушек . Хотелось бы, чтобы у меня был никель на каждый час , который какой-то студент CS где-то потратил, пытаясь заставитьscanf
вести себя так, как подсказывает их интуиция. Я бы уже вышел на пенсию на своем частном острове. Но я отвлекся.Одним из способов обойти эту конкретную ловушку является проверка, не удалось ли
scanf
, и если это так, преднамеренно потреблять и отбрасывать весь ввод отstdin
до следующего символа новой строки илиEOF
, в зависимости от того, что наступит раньше.Сначала давайте рассмотрим некоторый фиксированный код un , который вызывает бесконечный цикл, если вы введете нецелое число в качестве ввода:
// Typing the letter 'n' and hitting <Enter> here causes an infinite loop: int num, status; while (1) { printf("Enter a number: "); status = scanf("%d", &num); if (status == 1) printf("OK\n"); else printf("Invalid number\n"); }
Приведенный выше код будет (после Вы вводите
n
и нажимаете<Enter>
), входите в бесконечный цикл и просто начинаете извергать «Неверное число» снова и снова. Опять же, это потому, что введенное вамиn
никогда не удаляется из буфера ввода.Существует несколько возможных способов обойти эту проблему , но, по-видимому, все согласны с тем, что наиболее переносимый и надежный способ сделать это заключается в следующем:
// Fixed. No more infinite loop. int num, status; while (1) { printf("Enter a number: "); status = scanf("%d", &num); if (status == 1) printf("OK\n"); else { printf("Invalid number\n"); // Consume the bad input, so it doesn't keep getting re-read by scanf int ch; while ((ch = getchar()) != '\n' && ch != EOF) ; if (ch == EOF) break; } }