Чтение строки до нажатия клавиши ввода или в пределах массива - PullRequest
2 голосов
/ 20 апреля 2011

Я хочу прочитать строку через клавиатуру, чтобы избежать переполнения буфера. Когда я использовал fgets(text,30,stdin), он читает, но также читает символ '\ n'. Но я не хочу читать символ '\ n'.

Ответы [ 3 ]

2 голосов
/ 20 апреля 2011
char s[30];
scanf("%30[^\n]", s);

немного пояснить:

% 30 [^ \ п]

30, что означает чтение не более 30 символов, [^\n], что означает чтение любого символа, кроме '\ n'.

1 голос
/ 20 апреля 2011

Так что удалите перевод строки, как только у вас будет строка:

int get_line(char *buffer, size_t max)
{
  if(fgets(buffer, max, stdin) == buffer)
  {
    size_t len = strlen(buffer);
    if(len > 0 && buffer[len - 1] == '\0')
      buffer[--len] = '\0';
    return len;
  }
  return 0;
}

ОБНОВЛЕНИЕ : Изменено, чтобы возвращать длину, что может избавить абонента от некоторых проблем Это означает, что для ввода пустой строки он вернет 0.

0 голосов
/ 20 апреля 2011

Читать с символом '\n', но потом удалить его

if (fgets(text, 30, stdin)) {
  size_t tlen = strlen(text);
  if (len > 0) {
    if (text[tlen - 1] == '\n') {
      text[--tlen] = 0;
    } else {
      /* fgets read all it could
      ** but there wasn't a '\n'
      ** for the number of bytes available */
    }
  } else {
    /* empty string read: not even a '\n' */
  }
} else {
  /* fgets failed */
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...