замяніць некалькі нарыхтовак з адной нарыхтоўкі ў C

Я пішу просты код праграмавання C замяніць радок з некалькіх нарыхтовак з адной нарыхтоўкай. мой код выглядае наступным чынам, але гэта, відавочна, змяшчае памылкі. Я стараюся пазбягаць выкарыстання масіва або паказальнікаў. Таму любыя парады аб тым, як выправіць сваю памылку?

#include 
int main(void)
{
    int c,d;
    d=0;
    while((c=getchar())!=EOF)
        {
        if (c==' ')
            {
                d=getchar();
                if (d!=' '&&d!=EOF)
                    putchar(c);
            }
        putchar(c);
        }
}
1

7 адказы

Пры выкананні такога роду фільтрацыі, гэта часта добрая ідэя, каб ніколі не паўтараць чытанне ўваходных дадзеных, так што, як правіла, рассейваюць логіку. Прынамсі, у маім вопыце, я лічу, гэта лягчэй, калі я прачытаю ўвод у адзін месца, а затым справіцца з ёй.

Для вырашэння гэтай праблемы простае стан машыны досыць: проста памятаеце, калі апошні сімвал быў пустым або няма, і толькі выходныя прабелы, калі апошні лічыцца сімвалам ня быў пустым.

3
дададзена

Па-першае: пазбягаць использованияКонтактная GetChar , putchar . Выкарыстоўвайце ЕОКП , putc замест гэтага.

Калі вы дрэнна хочаце прачытаць сімвал за сімвалам, то што-то, як гэта будзе рабіць:

int c, lastc = '\0';
while((c = getc(stdin)) != EOF) {
    if (c == ' ' && lastc == ' ')
        continue;
    putc(c, stdout);
    lastc = c;
}
2
дададзена
На жаль, мая памылка, блытаць іх з атрымлівае , які сапраўды састарэлае. Выдаленыя гэтую частку.
дададзена аўтар Sergey L., крыніца
Вы маеце рацыю наконт ініцыялізацыі.
дададзена аўтар Sergey L., крыніца
Дзе гэта сказана, што GetChar і putchar састарэлі? Я не бачу ніякіх прыкмет таго, што ў 7.21.7.6 або 7.21.7.8 ў N1570.
дададзена аўтар Daniel Fischer, крыніца
Разумею. <�Код> атрымлівае не толькі састарэў, ён быў <�я> выдаленыя , о радасць!
дададзена аўтар Daniel Fischer, крыніца
<�Код> lastc можа быць выкарыстаны неинициализированным. І, калі ласка, устаўка працягнуць у новым радку.
дададзена аўтар Jonatan Goebel, крыніца

Выкарыстоўвайце сцяг, каб памятаць, калі вы чыталі пусты ці не:

#include 

int main( void )
{
  int lastBlank = 0;
  int c;

  while ( (c = fgetc( stdin )) != EOF )
  {
    if ( c != ' ' || !lastBlank )
      fputc( c, stdout );

    lastBlank = ( c == ' ' );
  }
  return 0;
}
1
дададзена
#include

int nextChar(FILE *fp){
    static int buff = 0;
    int ch = fgetc(fp);
    if(buff != ch)
        buff = ch;
    else
        while(buff == ' ')
            buff = fgetc(fp);
    return buff;
}

int main(void){
    FILE *fp = stdin;
    int ch;
    while(EOF!=(ch=nextChar(fp))){
        putchar(ch);
    }
    return 0;
}
0
дададзена

Гэты код, здаецца, працуе нармальна:

#include 

int main(void)
{
    int c, d;
    d = 0;
    while ((c = getchar()) != EOF)
    {
        if (c == ' ')
        {
            while ((d = getchar()) == ' ');
            putchar(c);
            putchar(d);
        } else {
            putchar(c);
        }
    }
}
0
дададзена
# include 

int main(){

  int c , n;
    n=0;

    while((c=getchar())!= EOF) {
        if (c == '\t') {

            if (n<1){
                putchar('\t');
                n=n+1;
            }
        }
        else {
            n=0;
            putchar(c);
        }
    }
}
0
дададзена
#include 

/*copy input to output, replacing each 
string of one or more blanks by a single blank.*/

main() {

    int c;

    while((c =getchar()) != EOF) {
        if (c!= ' ') 
            putchar(c);
        else {
            putchar(c);
            while((c =getchar()) == ' ');
            putchar(c);
        }
    }
}
0
дададзена