Nauka C na podstawie ANSI C Kernighan, Ritchie

0

Hej

zaczynam uczyć się programowania w C, słowo zaczynam na prawdę oddaje mój poziom, mam na ten temat bardzo nikłe pojęcie więc moje pytania mogą być na prawdę na niskim poziomie. No ale cóż, chyba każdy kiedyś miał taki problem ;)

Uczę się na podstawie chyba najbardziej znanej książki ANSI C Kernighan Ritchie i na tą chwilę mam problem z programem do zliczania znaków. Napisałem coś takiego:

#include "stdio.h"
#include "stdlib.h"

main()
{
    long nc;
    int t;
    printf("podaj tekst: \t");
    scanf("%d,&t",t);
    for(nc=0;(t=getchar())!=EOF;++nc)
    ;
    printf("%ld\n",nc);


}
 

odpalam program, wpisuje tekst, enter i nic się nie pojawia. Jeżeli wykreślę średnik po for to wtedy printf wyświetlające ilość znaków jest w pętli i pojawia się ciąg cyfr jeden pod drugim, ja bym jednak chciał żeby wyświetliła się tylko jedna, ostatnia cyfra (ilość znaków w podanym tekście). Jak to zrobić?

0

Jeżeli chcesz zliczać do znaku końca linii to powinno to wyglądać tak:

#include <stdio.h>
 
int main()
{
    long nc;
    int t;
    printf("podaj tekst: \t");
    for(nc=0; (t=getchar())!='\n'; ++nc);
    printf("%ld\n", nc);
    return 0;
} 
0

mógł bym poprosić o małe wytłumaczenie?
usunąłeś scanf - w jaki sposób teraz program wczytuje tekst do zmiennej "t"?
i zamieniłeś EOF na '\n' czyli mam rozumieć że koniec pliku nie oznacza końca wpisanego tekstu? Dlaczego w takim razie jeżeli printf wyświetlające ilość znaków było w pętli to ilość znaków wyświetlała się po każdym wykonaniu pętli?

0
wiwowiwo napisał(a):

usunąłeś scanf - w jaki sposób teraz program wczytuje tekst do zmiennej "t"?
getchar sam wczytuje znak, nie potrzebuje pomocy scanfa.

zamieniłeś EOF na '\n' czyli mam rozumieć że koniec pliku nie oznacza końca wpisanego tekstu?
http://pl.wikipedia.org/wiki/EOF

Dlaczego w takim razie jeżeli printf wyświetlające ilość znaków było w pętli to ilość znaków wyświetlała się po każdym wykonaniu pętli?
Szczerze mówiąc, nie rozumiem tego zdania.

0
#include "stdio.h"
#include "stdlib.h"

main()
{
    long nc;
    int t;
    printf("podaj tekst: \t");
    scanf("%d,&t",t);
    for(nc=0;(t=getchar())!=EOF;++nc)
    \*wyrzuciłem średnik *\
    printf("%ld\n",nc);


}

 

teraz program wyświetla ciąg cyfr od 0 do tylu ile znaków ma wprowadzony tekst - chodzi mi o to dlaczego w takim układzie EOF działa a jeżeli wyrzucę printf poza pętlę (zostawię średnik) to już nie.

0

Jest w takim razie możliwe żeby w książce były błędy?

takie dwa skrypty prosto z książki i nie działają:

#include "stdio.h"


main()
{
    long nc;

    nc=0;
    while(getchar()!=EOF)
        ++nc;
    printf("%ld\n",nc);


}

 
#include "stdio.h"


main()
{
    float nc;

    nc=0;
    for(nc=0;getchar()!=EOF;++nc)
        ;
    printf("%.0f\n",nc);


}

 

oczywiście po zamianie na '\n' działa jak powinno
pytanie brzmi - dlaczego?

0

Ale jak to nie działają? A kończysz wpisywanie znakiem EOF? CTRL+D Unix, CTRL+Z Windows.

0

Jeśli używasz Linuksa to w terminalu wciśnij Ctrl+D, to wyśle sygnał zakończenia wejścia z klawiatury. W Windowsie jest chyba Ctrl+Z.

edit:
No znowu za późno.

0

korzystam z Windowsa i CodeBlocks albo Visual Studio
w CB program się odpala ale nie działa a w VS przy próbie odpalenia programu wyskakuje błąd.

Kiedy odpalę program w CB wpiszę tekst powiedzmy "ala ma kota" i wcisnę ctrl+z to dopisuje się tylko "^Z" i nic się nie dzieje, po wciśnięciu enter kursor przechodzi do następnej linii ale dalej nic.

0

Kody są poprawne:

endrju@kormoran smieciki % gcc -Wall -Wextra kr-test.c
kr-test.c:4:1: warning: return type defaults to ‘int’ [-Wreturn-type]
kr-test.c: In function ‘main’:
kr-test.c:14:1: warning: control reaches end of non-void function [-Wreturn-type]
endrju@kormoran smieciki % ./a.out 
123456
7

Po liczbie 6 nacisnąłem enter a potem CTRL+D. Wypisana liczba 7 jest prawidłowa: 6 znaków + znak nowej linii.

Widzisz tam też dwa ostrzeżenia, ale one nie mają wpływu na to jak działa program.

0

żeby w windowsie zrobić znak konca pliku należy wcisnąć ctrl+z następnie enter następnie znowu ctrl+z i znowu enter i dopiero wtedy program dostaje EOF
i takie coś działa! cieszę się ;)

CB ładnie mi odpala program, natomiast dokładnie to samo w VS nie chce działać, na uczelni używamy VS więc wolał bym przyzwyczajać się do niego. Pojawia mi się błąd "There were build errors. Would you like to continue and run the last successful build?" jeżeli kliknę yes to później pojawia się że system cannot fin the file specified...
Ma ktoś jakiś pomysł

na wszelki wypadek zapytam jeszcze - jeżeli chce coś robić w C w Visualu to w new project wybieram Visual C++ i Win32 Console application?

0
wiwowiwo napisał(a):

Pojawia mi się błąd "There were build errors. Would you like to continue and run the last successful build?" jeżeli kliknę yes to później pojawia się że system cannot fin the file specified...
Ma ktoś jakiś pomysł

Nawet trzy pomysły:

  1. Przeczytać i zrozumieć treść komunikatu zanim się wciśnie cokolwiek.
  2. Czytać komunikaty błędów kompilatora.
  3. Patrz punkt 1.

na wszelki wypadek zapytam jeszcze - jeżeli chce coś robić w C w Visualu to w new project wybieram Visual C++ i Win32 Console application?

I jeszcze "Empty Project" po drodze.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.