Проверить целое число против символов

Это чистое решение для 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;
}

Live demo

Кредит относится к Dave и Sime Vidas

Использование более современных JS, hasClass может быть реализовано как:

function hasClass(elem, className) {
    return elem.classList.contains(className);
}

0
задан Daniel Logvin 28 March 2019 в 00:55
поделиться

2 ответа

Функция 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);
      }
    }
0
ответ дан ssoBAekiL 28 March 2019 в 00:55
поделиться

Как говорит @MFisherKDX, проверьте возвращаемое значение scanf. Со страницы руководства scanf :

Эти функции возвращают количество входных элементов, успешно сопоставленных и назначенных, которое может быть меньше предусмотренного или даже равно нулю в случае ошибка раннего сопоставления.

Значение EOF возвращается, если достигнут конец ввода перед первым успешным преобразованием или ошибкой сопоставления. EOF также возвращается, если происходит ошибка чтения, и в этом случае устанавливается индикатор ошибки для потока (см. Ferror (3)), и устанавливается errno, обозначающий ошибку.

Таким образом, захват возвращаемого значения 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;
  }
}
0
ответ дан Mike Holt 28 March 2019 в 00:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: