Как взять строку в качестве ввода и затем напечатать каждое слово в новой строке - PullRequest
0 голосов
/ 04 февраля 2020

Я хочу взять строку в качестве ввода и затем напечатать каждое слово в новой строке.

Условие: напечатанное слово должно быть сохранено в массиве и каждое слово будет удалено из массива после его печати. ​​

#include<stdio.h>
int main() {
  char s[100], tmp[20];
  int i=0,space=0,k;
  scanf("%[^\n]", s);

  while(s[i]!='\0'){
    if(space==0) tmp[i]=s[i]; //copying word only
    else tmp[i-(k+1)]=s[i];   //copying word only

    if((s[i]==' ')||(s[i+1]=='\0')){
      tmp[i+1]='\0';
      space++;
      printf("%s\n", tmp); //printing word from an array

      for(int j=0; tmp[j]!='\0'; j++) tmp[j]='\0'; //erasing this array for reuse
      k=i++; //(i++) for skip space and 'k' for starting index from tmp[0]
      if(s[i]=='\0') i--; //when null don't need to increase i for skip space
    }
  i++;
  }
  return 0;
}

Может кто-нибудь помочь мне разобраться в проблеме?

1 Ответ

0 голосов
/ 05 февраля 2020

Это явно нарушает ваше состояние, но оно неуместно, и я думаю, что читателю стоит посмотреть, как это сделать без него. Основным преимуществом этого подхода является то, что вы не накладываете произвольные ограничения на длину ввода. (В исходном коде ввод не должен превышать 100 байт.) Я предполагаю, что ваша задача состоит в том, чтобы просто реализовать tr -s '[[:space:]]' \\n, и в этом случае вы можете сделать:

#include <stdio.h>
#include <ctype.h>

/* Simple implementation of tr -s '[[:space:]]' \\n */

int
main(void)
{
        int in_space = 0;
        int c;
        while( (c = getchar()) != EOF  ) {
                if(isspace(c)) {
                        if( !in_space )
                                putchar('\n');
                        in_space = 1;
                } else {
                        in_space = 0;
                        putchar(c);
                }
        }
        if(!in_space)
                putchar('\n');
        return 0;
}

Что может быть упрощено в некоторой степени (ИМО, вышеизложенное чрезмерно избыточно):

#include <stdio.h>
#include <ctype.h>

/* Simple implementation of tr -s '[[:space:]]' \\n */

int
main(void)
{
        int c;
        int last = '\n';
        while( (c = getchar()) != EOF  ) {
                c = isspace(c) ? '\n' : c;
                if( c != '\n' || last != '\n' )
                        putchar(c);
                last = c;
        }
        if( last != '\n' )
                putchar(c);
        return 0;
}

или даже:

#include <stdio.h>
#include <ctype.h>

/* Simple implementation of tr -s '[[:space:]]' \\n */

void
dedup(int c)
{
        static int last = '\n';
        if( c != '\n' || last != '\n' )
                putchar(c);
        last = c;
}

int
main(void)
{
        int c;
        while( (c = getchar()) != EOF  ) {
                dedup( isspace(c) ? '\n' : c);
        }
        dedup('\n');
        return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...