2010-03-20 5 views
2

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

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

ответ

2

Итеративно используйте 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

Я надеялся, что существует способ использования getchar() игнорировать все пробелы. Я пробовал просто делать: while ((ch = getchar())! = '\ N' && (int) ch! = EOF); , но это вызвало бесконечный цикл – Gary

+0

Обратите внимание, что я объявлял 'c' как' int', а не как 'char'; Я также тестировал EOF перед новой строкой, хотя он будет работать наоборот, если вы назначаете 'int', а не' char'. Помните, что функции (макросы) 'getc()' и 'getchar()' возвращают INTEGER, а не 'char'. Все, что вам говорят три раза, верно. –

0

изложив предложение дал Джонатан Леффлера о 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. :)

+0

fgets возвращает указатель на строку, а не int, fyi;) – Gary

+1

Помните, что 'getc()' нуждается в указателе файла (предположительно stdin задан вопрос), но 'getchar()' предполагает stdin. И будьте осторожны с EOF - ваш внутренний цикл не остановится, если в файле нет новой строки. –

0

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

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

Используйте 'sizeof (str)' вместо 80. –

Смежные вопросы