Как выйти из программы C с помощью клавиши Enter - PullRequest
2 голосов
/ 22 октября 2019

Я пытаюсь найти способ выхода из моей программы, нажимая клавишу Ввод , когда программа запрашивает число.

Я пытался выполнить этот оператор if в моемmain() но, похоже, не работает.

int main()
{
  while(1){
    int val;
    printf("\nnumber to convert:\n ");
    scanf("%i", &val);

    ibits(val);
    if (val = '\n')
    {
      break;
    }
  }

  return 0;
}

1 Ответ

3 голосов
/ 22 октября 2019

Вы действительно не должны использовать scanf напрямую ... особенно если вы ожидаете нескольких возможных форматов.

Попробуйте вместо этого использовать fread и затем преобразовать ввод в правильный формат.

т.е.:

int main() {
  while (1) {
    char buf[1024];
    printf("\nnumber to convert:\n ");
    unsigned long len = fread(buf, 1, 1023, stdin);
    buf[len] = 0;
    if (len == 0 || (len == 1 && buf[0] == '\n') ||
        (len == 2 && buf[0] == '\r' && buf[1] == '\n'))
      break;
    int val = atoi(buf);
    ibits(val);
  }
  return 0;
}

Это также позволит вам проверять ввод и проверять атаки переполнения:

int main() {
  while (1) {
    char buf[1024];
    printf("\nnumber to convert:\n ");
    unsigned long len = fread(buf, 1, 1023, stdin);
    buf[len] = 0;
    if (len > 11)
      goto under_attack;
    if (len == 0 || (len == 1 && buf[0] == '\n') ||
        (len == 2 && buf[0] == '\r' && buf[1] == '\n'))
      break;
    if (buf[0] != '-' && (buf[0] < '0' || buf[0] > '9'))
      goto under_attack;
    int val = atoi(buf);
    ibits(val);
  }
  return 0;

under_attack:
  fprintf(stderr, "Under attack?!\n");
  return -1;
}
...