2015-02-06 2 views
2

У меня возникли проблемы с игнорированием пробела/табуляции. Когда пользователь вводит символ из командной строки, он должен принимать только любые символы, кроме пробелов или пробелов.Игнорировать пробел getchar()

например:

$ ./a.out Character: = 

Тогда это =

если

$ ./a.out Character:  = 

С кучей пространств, то он должен обнаружить, как =

Я уже объявленной переменной в ,

char a; 
printf("Character: "); 
a = getchar(); 

Код:

while((a = getchar()) != EOF){ 
     if(a != ' ' || a != '\t'){ 
      a = getchar(); 
      break; 
     } 
    } 

Любая помощь будет большим. Благодарю.

+1

Изменение 'обугливается а,' 'в Int а,' как 'EOF' является' int'. – ouah

ответ

0

Используя break, вы остановите цикл while. Используйте continue вместо:

while((a = getchar()) != EOF){ 
    if(a != ' ' || a != '\t') continue; 
    [...] 
} 
0

Вы можете изменить тело в while() петлю, как

while((a = getchar()) != EOF){ 
     if(a == ' ' || a == '\t') 
       continue;    // if space ot tab is detetected, scan for next input 
     else 
      { 
      putchar(a);     //neither a space nor a tab, print it. 
      break; 
      } 
    } 

Кроме того, как тип возвращаемого getchar() является int, вы должны использовать int a.

1

Как насчет:

#include <ctype.h> 

int a; 

do 
{ 
    a = getchar(); 
} while (isspace(a)); 

, как EOF не символ пробела, вам не нужно обрабатывать его специально.

Вы можете положить, что в маленькой функции своих собственных, если вам нравится:

int 
getcharnospace() 
{ 
    int a; 
    do 
    { 
     a = getchar(); 
    } while (isspace(a)); 
    return a; 
} 
+0

В вашем первом коде он не вводит пробелы или пространства табуляции, просто '=', он просто будет продолжать цикл. – user4538951

+0

@ user4538951 он будет работать только в том случае, если 'isspace (a)' возвращает 1, что будет, если 'a' - это пробел. – abligh

3

Update: Как заметил chux, getchar() возвращает тип int, и вы не можете успешно прочитать полный спектр возможных символов если этот результат присваивается переменной типа char. Фактически (я добавляю), вы рискуете вызвать поведение, определенное определением реализации, сделав это. Короче говоря, переменная a должна иметь тип int.

С учетом сказанного, похоже, что вы хотите что-то вдоль этих линий:

do { 
    a = getchar(); 
} while (a == (unsigned char) ' ' || a == (unsigned char) '\t'); 

Обратите внимание, что EOF, отличается от обоих ' ' и '\t', так что вы можете спокойно отложить тестирование на него, пока после цикла.

Обратите также внимание, что если вы хотите игнорировать символы новой строки и другие символы пробелов, то вы можете получить хорошее использование из стандартной библиотечной функции isspace().

+0

Если я не набираю пробелы или пробелы, просто =, программа обнаруживает, что символ «пробел» или «табуляция», не равен. – user4538951

+0

@ user4538951, я не понимаю, что вы пытаетесь сказать. Однако код, представленный мной, одинаково хорошо работает независимо от того, предшествует ли символ '=' символу пробелом или нет. После выхода цикла переменная 'a' будет содержать значение первого входного символа, который не является ни пространством, ни вкладкой, в том числе, если это первый символ, который читается, или он будет содержать' EOF', если конец поток был достигнут до того, как любой такой символ был прочитан. –

+0

Для полной функциональности важно, чтобы 'a' был' int'. – chux

1
int a; 
while(a=getchar()){ 
     if(a==' ' || a=='\t') 
      continue; 
     else 
      putchar(a); 
} 
0
  1. Space ' ' не в С. только пробельные char
  2. Tab '\t' является одним из пробельных языка C char.
  3. Используйте int ch, а не char ch, чтобы отчетливо сохранить все результаты с getchar().
  4. isspace(EOF) всегда неверно.
  5. Используйте issapce(), это стандартная функция C для обнаружения пробела.

    // char a; 
    int a; 
    printf("Character: "); 
    
    // All that is needed to consume white-space characters 
    while(isspace(a = getchar())); 
    
Смежные вопросы