игнорировать лишние пробелы при использовании fgets

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

Может ли кто-нибудь посоветовать мне, как игнорировать все эти лишние пробелы при использовании fgets и переходить к следующей строке?


person Gary    schedule 20.03.2010    source источник


Ответы (3)


Используйте fgets() итеративно, затем просмотрите строку, чтобы увидеть, все ли в ней пробелы (и заканчивается ли она новой строкой), и проигнорируйте ее, если это так. Или вместо этого использовать getc() или getchar() в цикле?

char buffer[26];

while (fgets(buffer, sizeof(buffer), stdin) != 0)
{
    ...process the first 25 characters...
    int c;
    while ((c = getchar()) != EOF && c != '\n')
        ;
}

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

person Jonathan Leffler    schedule 20.03.2010
comment
Я надеялся, что есть способ использовать getchar(), игнорируя все пробелы. Я пробовал просто делать: while( (ch = getchar()) != '\n' && (int)ch != EOF ); но это вызвало бесконечный цикл - person Gary; 20.03.2010
comment
Обратите внимание, что я объявил c как int, а не как char; Я также тестировал EOF перед новой строкой, хотя это будет работать наоборот, если вы назначите int, а не char. Помните, что функции (макросы) getc() и getchar() возвращают INTEGER, а не char. Все, что вам говорят трижды, — правда. - person Jonathan Leffler; 20.03.2010

Объяснение предложения Джонатана Леффлера о getc():

Я предполагаю, что у вас есть такой цикл:

while (!feof(stdin)) {
  fgets(buf, 25, stdin);
  ...
}

измените это так:

while (!feof(stdin)) {
  int read = fgets(buf, 27, stdin);
  if (read > 26) { // the line was *at least* as long as the buffer
    while ('\n' != getc()); // discard everything until the newline character
  }
  ...
}

Редактировать: Ах, Джонатан быстрее, чем я, пишет C. :)

person Paul Tillotson    schedule 20.03.2010
comment
Помните, что getc() нужен указатель файла (предположительно, стандартный ввод, учитывая вопрос), но getchar() предполагает стандартный ввод. И остерегайтесь EOF - ваш внутренний цикл не остановится, если в файле не останется новой строки. - person Jonathan Leffler; 20.03.2010

Попробуйте этот код для удаления конечных пробелов.

 char str[100] ;
    int i ;
    fgets ( str , 80 , stdin ) ;
    for ( i=strlen(str) ; i>0 ; i-- )
    {
            if ( str[i] != ' ' )
            {
                    str[i+1]='\0';
                    break ;
            }
    }
person Pavunkumar    schedule 20.03.2010
comment
Используйте 'sizeof(str)' вместо 80. - person Jonathan Leffler; 20.03.2010