Отображение строки по одному слову в строке с использованием флага IN / OUT - PullRequest
0 голосов
/ 16 октября 2018

Я написал программу, которая сначала сохраняет произвольное количество строк текста от пользователя.После этого он проверяет, когда пришло новое слово, и если это произойдет, то печатает его в новой строке.Ниже приведен мой код:

 #include<stdio.h>
 #define IN 1   //inside a word
 #define OUT 0  //outside a word

int main()
{
  char s[100];   //storing the string entered by user
  int c;         //getchar reading variable
  int i=0;       //iterating variable

  while((c=getchar())!=EOF)
  {
    s[i++]=c;
  }
  s[i]='\0';   //end of string


  i=0;
  int p=0;    //stores the start of the word
  int current=OUT; //flag to indicate if program is inside or outside a word

  while(s[i]!='\0')  
  {
    if(current==OUT)  //when program is outside a word
    {
        if(s[i]!=' ' || s[i]!='\n' || s[i]!='\t')  //word found
        {
            p=i;  //store starting position of word 
            current=IN;
        }
    }
    else if(current==IN) //program is inside a word
    {
        if(s[i]==' ' || s[i]=='\n' || s[i]=='\t') //end of word found
        {
            current=OUT; //flag now outside the word
            for(int j=p;j<i;j++) //print from starting position of word
            {
                printf("%c",s[j]);
            }

            printf("\n");  //go next line

        }

    }
    ++i;  //incremnent the iterator variable
 }

return 0;
}

Моя программа работает хорошо, если я просто правильно ввел строку, то есть без лишних пробелов или новых строк.Но если я введу строку следующим образом ( обратите внимание на лишние пробелы и новые строки ):

* Я мальчик

Я отправился в Японию * /

Затем он печатает эти дополнительные символы новой строки и пробелы вместе со словом, что, по моему мнению, не должно происходить из-за флагов IN и OUT.Вывод выглядит так: введите описание изображения здесь Я прошу вас, пожалуйста, помочь мне.

Я знаю, что я могу легко это сделать с помощью метода putchar (), проверяющего один символкогда-то, но мне просто любопытно, что я делаю неправильно в этой реализации.

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Ваше условие фильтрации для определения, является ли символ пробелом, неверно.Оператор || означает ИЛИ.Использование цепочки ИЛИ позволит выражению каждый раз принимать значение true.Вам нужен оператор AND &&.Оператор and завершается ошибкой, как только один операнд оценивается как false, или в случае C, 0.

Кроме того, существуют более эффективные способы проверки наличия пробелов.Одна из идей - использовать функцию isspace из <ctype.h>, которая принимает символ как int, который также может быть unsigned char, и определяет, является ли этот символ любым из ' ', '\t', '\v', '\n' or '\r',Вы также можете выполнять проверку символов с помощью операторов switch

switch(ch) {
    case ' ':
       // do something
        break;
    case '\n':
      //do something
        break;
}
0 голосов
/ 16 октября 2018

Первая ошибка, которая выскакивает у меня:

if(s[i]!=' ' || s[i]!='\n' || s[i]!='\t')

всегда будет возвращать true.Вы хотите &&, или использовать !() вокруг всего условия, которое вы используете в другом месте, для симметрии.

Или еще лучше, выделить это в функцию, или использовать isspace из<ctype.h>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...