Program wyświetlający słowa w innych liniach

Odpowiedz Nowy wątek
2011-07-14 16:43
0

Witam, nazywam się Tomek. Zaczynam studia Informatyczne od września. Jestem prawie laikiem w dziedzinie programowania. Więc zacząłem się uczyć.
Mój program ma na celu odczytać wpisany tekst po czym każde jego słowo wypisać w osobnej linijce.

 
#include <stdio.h>
 
main()
{
      int c;
      c = getchar();
          while(c != EOF){
                   putchar(c);
                   c = getchar();
                   if(c == ' '|| c == '\t' || c == '\n')
                   printf("\n");
                   putchar(c);
                   c = getchar();
                   }
 
system("PAUSE");
      return 0;
 
}
 

Jednak przy dłuższych tekstach zdarza się, że program w jednej linii wyświetli 2 - 3 słowa.

edytowany 1x, ostatnio: madmike, 2011-07-23 16:17
system("PAUSE") to zło wcielone. Użyj czegoś innego :) - Patryk27 2011-07-14 16:58
dlaczego zło? ;) jeszcze się nie zawiodłem :) - kolaszek 2011-07-14 17:00
Bo nie działa na linuxach ;) - Patryk27 2011-07-14 17:05

Pozostało 580 znaków

2011-07-14 17:07
uuu
0

"dlaczego zło? ;) jeszcze się nie zawiodłem :) - kolaszek"
dlatego, ponieważ aby twój program działał poprawnie potrzebujesz innego zewnętrznego programu "pause", który poza tym nie musi być obecny na innych systemach operacyjnych. Po co tracić na przenośności z powodu głupiego (i niepotrzebnego w zasadzie) zatrzymania programu na końcu jego działania. Skoro jednak chcesz już zatrzymywać to lepiej zainteresować się bardziej standardowymi (i przenośnymi) sposobami uczynienia tego samego :]

Pozostało 580 znaków

2011-07-14 17:10
0

bo testowanie robisz tylko dla co drugiego znaku, za dużo masz tego c = getchar(); putchar(c); wewnątrz pętli.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22, 2011-07-14 17:11

Pozostało 580 znaków

2011-07-14 17:11
0

Okej, zainteresuje się tym ;)
A teraz do rzeczy. Co sądzicie na temat mojego problemu?

Edit. Dzięki Marek, zaraz przejrzę rozwiązanie :)

edytowany 1x, ostatnio: kolaszek, 2011-07-14 17:12

Pozostało 580 znaków

2011-07-14 17:18
0

Czy dobrze myślę?

podczas kiedy c nie jest koncem pliku to:
jeśli c równe jest spacji tabulacji lub końcowi linii to wykona instrukcje printf + putchar + c=getchar.
a jesli nie to zacznie od putchar.

Ale skąd komputer wie ze ma zacząć od putchar?

Edit: Już zrozumialem ;)

edytowany 1x, ostatnio: kolaszek, 2011-07-14 17:55

Pozostało 580 znaków

2011-07-14 17:57
0

Ja bym to zrobił tak, chyba prościej?:
1.fgets pobieram całą linię tekstu

  1. w pętli wypisuje po literce tekstu, jeśli natrafię na spacje/tabulator, wypisuję znak nowej linii

@edit
To masz kod:

 
#include <stdio.h>
#include <string.h>
#define MAX 1000000
 
char linia[MAX];
 
int main()
{
    fgets(linia, MAX, stdin);
    int i = 0;
    while(i < strlen(linia))
    {
        if(linia[i] == ' ' || linia[i] == '\t')
            printf("\n");
        else
            printf("%c", linia[i]);
        i++;
    }
    return 0;
}
edytowany 2x, ostatnio: piternet, 2011-07-14 18:07

Pozostało 580 znaków

2011-07-14 18:06
0

Uczę się z książki Język ANSI C i używam tylko tych funkcji które znam :)

Pozostało 580 znaków

2011-07-14 18:09
niedozwolone ip
0
kolaszek napisał(a)

Mój program ma na celu odczytać wpisany tekst po czym każde jego słowo wypisać w osobnej linijce.

ja bym to zrobił [w C++] tak:

#include <iostream>
#include <string>
 
int main(int argc, char **argv)
{
    std::string linijka ;
    std::cout<<"Podaj linijke: ";
    getline(std::cin, linijka) ;
    std::cout<<"\nTwoja podzielona linijka:\n" ;
 
    bool bylaSpacja=1 ;
    for(int i=0; i<linijka.size(); ++i)
    {
        switch(linijka[i])
        {
            case ' ':
            case '\t':
            case '\n':
            {
                if(!bylaSpacja)
                {
                    std::cout<<'\n';
                    bylaSpacja=1 ;
                }
            }
            break ;
            default:
            {
                std::cout<<linijka[i] ;
                bylaSpacja=0;
            }
        }
    }
    std::cout<<"\n" ;
 
    return 0 ;
}

mój program ma zabezpieczenie przed podwójnymi spacjami obok siebie itp.

ale to ma być w C, to po cholere wklejasz kod w c++, kolega i tak sobie nie przerobi. - piternet 2011-07-14 18:12

Pozostało 580 znaków

2011-07-14 20:07
O_o
0

Tak przyszłościowo pisząc na wypadek gdybyś używał Dev C++:
Dev to zło. Zainstaluj Code::Blocks.


O̾..͠o

Pozostało 580 znaków

2011-07-14 21:19
0

ludzie przecież to jest poste jak konstrukcja cepa (mogłem pomylić string formatu, bo nie używałem tego wieki):

char buf[256];
while (scanf("%255s", buf)==1) {
    printf("%s\n", buf);
}

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.

Pozostało 580 znaków

2011-07-15 08:11
Kumashiro
0

Hmmm... Jednej rzeczy nie rozumiem. Wątkotwórca pisze program pod Windows. Zatem czy nie powinniśmy przypadkiem obsługiwać na wejściu także znaku powrotu karetki? Na konsoli go nie widać, ale IMHO nawet w trakcie nauki programowania warto się uczulać na takie "drobnostki". Chyba, że Windows z 0C0A przeszedł na 0A (nie jestem na bieżąco).

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0