игнорировать лишние пробелы при использовании fgets - PullRequest
3 голосов
/ 20 марта 2010

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

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

Ответы [ 3 ]

2 голосов
/ 20 марта 2010

Используйте 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')
        ;
}

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

0 голосов
/ 20 марта 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 ;
            }
    }
0 голосов
/ 20 марта 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. :) 1009 *

...