Удаление завершающего символа новой строки из ввода fgets () - PullRequest
191 голосов
/ 22 апреля 2010

Я пытаюсь получить некоторые данные от пользователя и отправить их другой функции в gcc. Код примерно такой.

printf("Enter your Name: ");
if (!(fgets(Name, sizeof Name, stdin) != NULL)) {
    fprintf(stderr, "Error reading Name.\n");
    exit(1);
}

Однако я обнаружил, что в конце он имеет символ новой строки \n. Так что, если я введу John, он отправит John\n. Как мне удалить это \n и отправить правильную строку.

Ответы [ 12 ]

0 голосов
/ 18 февраля 2016

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

int zstring_search_chr(const char *token,char s){
    if (!token || s=='\0')
        return 0;

    for (;*token; token++)
        if (*token == s)
            return 1;

    return 0;
}

char *zstring_remove_chr(char *str,const char *bad) {
    char *src = str , *dst = str;
    while(*src)
        if(zstring_search_chr(bad,*src))
            src++;
        else
            *dst++ = *src++;  /* assign first, then incement */

    *dst='\0';
        return str;
}

Пример использования может быть

Example Usage
      char s[]="this is a trial string to test the function.";
      char const *d=" .";
      printf("%s\n",zstring_remove_chr(s,d));

  Example Output
      thisisatrialstringtotestthefunction

Возможно, вы захотите проверить другие доступные функции или даже внести свой вклад в проект :) https://github.com/fnoyanisi/zString

0 голосов
/ 18 ноября 2015

Tim Čas one liner поражает строками, полученными при вызове fgets, потому что вы знаете, что в конце они содержат одну новую строку.

Если вы находитесь в другом контексте и хотите обрабатывать строки, которые могут содержать более одной новой строки, возможно, вы ищете strrspn.Это не POSIX, то есть вы не найдете его на всех Unices.Я написал один для своих нужд.

/* Returns the length of the segment leading to the last 
   characters of s in accept. */
size_t strrspn (const char *s, const char *accept)
{
  const char *ch;
  size_t len = strlen(s);

more: 
  if (len > 0) {
    for (ch = accept ; *ch != 0 ; ch++) {
      if (s[len - 1] == *ch) {
        len--;
        goto more;
      }
    }
  }
  return len;
}

Для тех, кто ищет эквивалентный Perl Chomp в C, я думаю, что это он (chomp удаляет только завершающий перевод строки).* Функция strrcspn:

/* Returns the length of the segment leading to the last 
   character of reject in s. */
size_t strrcspn (const char *s, const char *reject)
{
  const char *ch;
  size_t len = strlen(s);
  size_t origlen = len;

  while (len > 0) {
    for (ch = reject ; *ch != 0 ; ch++) {
      if (s[len - 1] == *ch) {
        return len;
      }
    }
    len--;
  }
  return origlen;
}
...