goto в инструкции switch, вызывающей бесконечный цикл [duplicate]

Он возвращает список, подобный массиву.

Вы делаете этот массив как пример

var el = getElementsByClassName("elem");
el = Array.prototype.slice.call(el); //this line
el[0].appendChild(otherElem);  
5
задан Gnijuohz 22 June 2012 в 15:24
поделиться

5 ответов

Лучше читать полную строку, используя 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. */
}
4
ответ дан unwind 22 August 2018 в 22:02
поделиться
  • 1
    использовать код, например, fgets (s, 10, stdin)? – Gnijuohz 21 June 2012 в 14:31
  • 2
    Благодаря! Я не знал strtol. Узнал много! – Gnijuohz 21 June 2012 в 14:44
  • 3
    извините, вы можете объяснить if(eptr == NULL || !isspace(*eptr))? при использовании кода, который вы даете, вводятся как «12 34», но их не должно быть. когда я вводил «1234», на что указывает eptr, и как насчет «12ab» и «12 34»? – Gnijuohz 21 June 2012 в 15:21

Вызов scanf("%*[^\n]\n") внутри цикла. Этого должно быть достаточно, чтобы отбросить все, что связано с кешем.

0
ответ дан Alex Lockwood 22 August 2018 в 22:02
поделиться

Но когда я вводил в него такие вещи, как abcd, цикл продолжался бы вечно и не останавливался для подсказки.

Это потому, что если 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 и конвертируйте по мере необходимости.

2
ответ дан John Bode 22 August 2018 в 22:02
поделиться

Я предлагаю ввести ввод как строку и проверить для него числовые символы. Если ввод действителен, преобразуйте строку в int с помощью sscanf(str,"%d",&i); или ошибки diplay.

1
ответ дан nav_jan 22 August 2018 в 22:02
поделиться

Просто вызовите scanf ("% * [^\n]\n") внутри цикла и отбросит «кеш».

1
ответ дан Spidey 22 August 2018 в 22:02
поделиться
  • 1
    Я попробовал это. Это не сработало. – Gnijuohz 21 June 2012 в 15:01
  • 2
    Это связано с тем, что поведение для fflush не определено для входных потоков. См. Стандарт C языка , раздел 7.19.5.2, параграф 2. – John Bode 21 June 2012 в 15:11
  • 3
    Вы оба правы. Надеюсь, что редактирование теперь корректно (на основе стандарта). – Spidey 21 June 2012 в 16:53
Другие вопросы по тегам:

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