getchar/putchar kontra while - gdzie tu jest błąd?

0
int c;

        c = getchar();
        while ((c=getchar() <=5))
            putchar (c);
            {
             printf("To jest mniej jak 5");
        }
        while ((c=getchar() >6))
        putchar (c);
        {
            printf("To jest wiecej jak 6");
        }

Program sprawdza dane z klawiatury. Dla każdej wpisanej liczby wyświetla ten sam komunikat i nie kończy pętli wyświetlając jakiegoś krzaka ....

2
c=getchar() <=5

Kolejność działań ma znaczenie - Twoje wyrażenie jest rozumiane jako:

c = (getchar() <= 5)

Btw, formatuj kod należycie - na to nie da się patrzeć :P

0

Też nic z tego. Po podaniu cyfry z zakresu 0-5 działa prawidłowo wyświetlając TO AUTO JEST MŁODE.
Po podaniu cyfry >5 ten sam komunikat.

#include <stdio.h>
#include <windows.h>

int main (void)

{

    char* autor = "Kamilka";
    char* opel = "OPEL";
    char* insignia = "INSIGNIA";
    char* astra = "ASTRA";
    char* laguna = "LAGUNA";
    char* opla = "OPLA";
    char* insignie = "INSIGNIE";
    char* astre = "ASTRE";
    char* lagune = "LAGUNE";

HANDLE kolor;
kolor = GetStdHandle( STD_OUTPUT_HANDLE );
    SetConsoleTextAttribute( kolor, 1 );
        printf (" ***** ROZPOCZECIE PROGRAMU ***** \n\n\n");

kolor = GetStdHandle( STD_OUTPUT_HANDLE );
    SetConsoleTextAttribute( kolor, 7 );

    printf(" Witamy w programie: %s \n\n", autor);
    printf(" Moj obecny samochod to: %s %s \n\n", opel, insignia);
    printf(" %s mi sie znudzila i zmienilem na: %s \n" , insignia, astre);
    printf(" %s jednak nie przypadla mi \n do gustu i kupilem nowa: %s \n", astra, lagune);
    printf(" %s okazala sie jednak szrotem i ponownie kupilem %s \n\n", laguna, opla);
    printf(" ***** TERAZ ZMIANA NAZW ZMIENNYCH ***** \n\n\n");

    char* corsa = "CORSA";
            printf(" Obecnie moj samochod to %s %s \n", opel, corsa);

        corsa = "corsunia";
            printf(" Tak bardzo lubie swojego %s ze nazwalem go %s \n", opla, corsa);

    char* corsidlo = "CORSIDLO";
            printf(" ale nazwa %s okazala sie lipna i nazwalem ja %s \n", corsa, corsidlo);
            printf(" \n\n\n");

    printf("W jakim wieku jest Twoje auto?? - wpisz cyfre i wcisnij ENTER : \n");


int c;
     c = getchar();
            while (c=getchar() <=5)
            putchar (c);
            {
             printf("To jest mlode auto");
            }
        while (c=getchar() >6)
            putchar (c);
            {
            printf("To auto jest stare");
        }

return 0;

}

Gdy zrobię tak jak mówisz czyli:

while c=getchar() <=5

to kompilator błąd wywala podając że przed c=getchar brakuje "(" a za nim ";"

3

Na to, co robisz, istnieje fachowa nazwa: https://en.wikipedia.org/wiki/Programming_by_permutation

Gdy zrobię tak jak mówisz czyli:

W którym momencie napisałem, abyś tak zrobił?

Po podaniu cyfry >5 ten sam komunikat.

Cyfry nie mają wartości, zatem nie istnieje coś takiego jak cyfra większa od ....

0

Coś nie tak jest z komunikatami na forum. W powiadomieniu jest że ktoś w wątku odpisał a postu nie widać:
title

Wracając do tematu...
To co zrobić by program oczekiwał liczb z zakresu np. 0-100 i tylko na nich operował?

Sądziłem że getchar() czeka na jakąś liczbę i gdy otrzyma np. cyfrę 3 to porówna zmienną wejściową z tym co ma zapisane czyli if <=5 to coś tam... itd.

2

Sądziłem że getchar() czeka na jakąś liczbę i gdy otrzyma np. cyfrę 3 to porówna zmienną wejściową z tym co ma zapisane czyli if <=5 to coś tam... itd.

Napiszę jeszcze raz to samo, co wyżej:

Kolejność działań ma znaczenie - Twoje wyrażenie jest rozumiane jako:

c = (getchar() <= 5)

Już abstrahując od tego, że ukryty jest tu drugi błąd: getchar zwraca znak ASCII, a nie cyfrę (w tym sensie).

0

Niestety nie umiem jeszcze tego ogarnąć.

Brak danych w łepetynie.
Syntax error! :-)

Jak to wyrażenie ma być napisane poprawnie?
Dobrze ja to ogarniam:

c = (getchar() <= 5)

zmienna c ma się równać zmiennej zapodanej z klawiatury ... i teraz mi nie pasuje w tym miejscu <=5
bo to bez sensu się czyta!

Nie wiem czy dobrze myślę ale chyba powinna być osobne wyrażenie do ustalenia jakiej zmiennej się oczekuje (liczby 0-100), osobne do przyjęcia c=getchar() oraz osobne do wykonania na tych zmiennych operacji, w tym przypadku porównania if=5, if=>5 itp. itd.

3

Bo to jest bez sensu napisane. A napisałeś to, niestety, Ty. Patryk27 Ci tylko to lepiej sformatował, byś mógł łatwiej zauważyć, co takiego zrobiłeś: przypisałeś do zmiennej c wartość porównania getchar() <= 5 — czyli jeśli pobrany znak ma kod ASCII od zera do piątki (czyli NUL, SOH, STX, ETX, EOT lub ENQ — wszystkie sześć niedrukowalne), to w c ląduje 1 (czyli prawda), a jeśli nie, to 0 (czyli fałsz).

1
gavallon napisał(a):
printf(" ***** TERAZ ZMIANA NAZW ZMIENNYCH ***** \n\n\n");

Ale zdajesz sobie sprawę, że nie ma możliwości zmiany nazwy zmiennej, a to co robisz to tworzenie zupełnie nowych kompletnie nie powiązanych z niczym zmiennych?
W zmiennych chodzi o to, że można zmieniać ich wartości a nie nazwy.

0

Słuchajcie, putchar i getchar w książce M.Ritchiego zostało opisane w około 20 linijkach bez jakiegokolwiek przykładu. Nadziałem się wczoraj na kursy internetowe (filmy z YT które kiedyś pobrałem na while itp) i nie chciał bym kolejny raz się męczyć.

c=getchar()   oraz   putchar(c)

są niestety opisane lekko niezrozumiale bo na przykładzie kopiowania plików:

#include <stdio.h>
#include <windows.h>
main()
    {
int c;         /*  deklaruję zmienną całkowitą c  -  zamiast INT można tu użyć CHAR ??  */
  c = getchar();   /* tutaj niby program czeka na wejście, pobiera znak z klawiatury */
    while (c != EOF) {   /*  no i dopóki C jest różne od EOF to jest PRAWDA i wykonuje się pętla, tak???   */
    putchar(c);      /* wyświetla znak */
    c = getchar();   /* i ponownie w pętli wykonuje do czasu FAŁSZU a po FAŁSZU program wykonuje następną linię spoza funkcji */
                     }
    printf(" ble,ble,ble");    /* czyli to...  */
}

Nie rozumiem tego EOF (koniec pliku). Zbyt ciężko Ritchie to opisał.

Mam pytanie: znaki z klawiatury wpisywane są tak jak je się widzi fizycznie (QWERTYUIOP....1234567890) czy np. w jakiś odpowiednikach w ASCII?
Można zrobić to tak?

#include <stdio.h>
#include <windows.h>
   main()
             {
    int c;                                        
    c = getchar();                            
          while (c != T) {               
                                   
       c = getchar();                    
                     }
      printf(" wybrano klawisz T");               
}

Wywala mi błąd że T jest niezadeklarowane!  Jak mam zadeklarować te T?

Chodzi mi o to że chciał bym użyć w programie zapytania do użytkownika: Czy chcesz rozpocząć program ? T/N
Jeśli USER wybierze T to tutaj chciał bym użyć znienawidzonej komendy GOTO :-)
W przypadku N tak samo ... dalsza część wykonywania programu od konkretnej linii.

Po czasie chciał bym aby program zapytał: W jakim wieku jest Twój ojciec?
getchar() od usera miał by być numeryczny z liczbami z zakresu 0-100.
Do pewnych zakresów 0-10, 10-20, 20-40, 40-60, 60-80, 80-100 chciał bym przypisać odpowiednie komunikaty...
User wpisuje 10 - program wyświetla "przecież to dziecko!" ale ... uwaga ... **kończy pętlę! ** Nie pyta ponownie o wiek ...
Do break jeszcze nie doszedłem :-)

1

getchar() od usera miał by być numeryczny z liczbami z zakresu 0-100.

Czy wiesz do czego służy ta funkcja. Jej nazwa mówi, że co pobiera? Użyj scanf ale pewnie zaraz powiesz, ze jesteś zbyt początkujący zamiast zwyczajnie to sprawdzić.

Do break jeszcze nie doszedłem

Tja... to jest bardzo skomplikowane po prostu przerwać pętlę. Powód? Ten sam co wyżej.

Jeśli USER wybierze T to tutaj chciał bym użyć znienawidzonej komendy GOTO

Zapomnij jak najszybciej.

zamiast INT można tu użyć CHAR

Można jeżeli zmieścisz się na jednym bajcie. int zazwyczaj jest czterobajowy, a char jednobajtowy. Jeden bajt to osiem bitów więc osiem jedynek albo zer. Na ośmiu bitach możesz zapisać 256 kombinacji. Tak więc char potrafi przechować liczbę od zera do 255 więc w sam raz dla kodów klawiszy w standardzie ASCII. Jak wiadomo klawisz reprezentuje jeden znak czyli character, stąd nazwa typu danych: char, będąca skrótem od character.

Natomiast int jest skrótem od integer czyli liczba całkowita.

1

Dzięki Grzesiek. Ogarnąłem.

#include <stdio.h>

 int main ()
 {
   int liczba = 0;
   printf ("Podaj wiek auta: ");
   scanf ("%d", &liczba);
   printf ("Twoje auto ma %d lat!", liczba);
   return 0;
 }

Przy okazji wypada też "nadrobić" https://pl.wikibooks.org/wiki/C/Podstawowe_procedury_wej%C5%9Bcia_i_wyj%C5%9Bcia :-)

0

Ok, dobra, działa. Obecnie całość wygląda tak:

#include <stdio.h>
#include <windows.h>
#include <stdlib.h>

int main (void)

{

char* autor = "Gavallona";
 char* opel = "OPEL";
 char* insignia = "INSIGNIA";
 char* astra = "ASTRA";
 char* laguna = "LAGUNA";
 char* opla = "OPLA";
 char* insignie = "INSIGNIE";
 char* astre = "ASTRE";
 char* lagune = "LAGUNE";

HANDLE kolor;
kolor = GetStdHandle( STD_OUTPUT_HANDLE );
SetConsoleTextAttribute( kolor, 4 );
 printf (" ***** ROZPOCZECIE PROGRAMU SAMOCHOD ***** \n\n\n");

 kolor = GetStdHandle( STD_OUTPUT_HANDLE );
SetConsoleTextAttribute( kolor, 7 );

printf(" Witamy w programie: %s \n\n", autor);
 printf(" Moj obecny samochod to: %s %s \n\n", opel, insignia);
 printf(" %s mi sie znudzila i zmienilem na: %s \n" , insignia, astre);
 printf(" %s jednak nie przypadla mi \n do gustu i kupilem nowa: %s \n", astra, lagune);
 printf(" %s okazala sie jednak szrotem i ponownie kupilem %s \n\n", laguna, opla);
 printf(" ***** TERAZ ZMIANA corsa=corsunia ***** \n\n\n");
 char* corsa = "CORSA";
 printf(" Obecnie moj samochod to %s %s \n", opel, corsa);
 corsa = "corsunia";
 printf(" Tak bardzo lubie swojego %s ze nazwalem go %s \n", opla, corsa);
char* corsidlo = "CORSIDLEM";
 printf(" ale nazwa %s okazala sie lipna i nazwalem go %s \n\n\n\n", corsa, corsidlo);
 printf(" Wcisnij dowolny klawisz by kontynuowac! \n\n\n");
getch();

system ("cls");

int liczba = 0;
   printf ("Podaj wiek obecnego auta: ");
   scanf ("%d", &liczba);
   printf ("Twoje auto ma %d lat!", liczba);
   return 0;

}

Teraz posiedzę trochę nad tym by to trochę usprawnić. Chodzi mi o to by....
gdy program zapyta o wiek ...
wyprowadzić na ekran rózne wyniki zależne właśnie od wprowadzonych danych.

Przykład:

Podaj wiek auta:    podajesz:  5    odpowiedź programu na ekranie:   To jest prawie nowe auto!
Podaj wiek auta:    podajesz:  10    odpowiedź programu na ekranie:   W Polsce to jest jeszcze prawie nowe auto!
Podaj wiek auta:    podajesz:  800    odpowiedź programu na ekranie:   Takiego auta nie ma bo go ruda zjadła!
Podaj wiek auta:    podajesz:  -5    odpowiedź programu na ekranie:   Pomiń minus i wpisz poprawnie wiek auta i tu ma się zapętlać!!

Jak to ogarnę to dalej będzie:

Podbieranie daty z systemu i wyświetlanie na ekran komunikatu: Na dzień dzisiejszy auto ma lat XXX
3

getchar() zwraca int, który

  • albo jest = EOF jeśli natrafiono na koniec strumienia wejścia
  • albo = znakowi wprowadzonemu

https://pl.wikibooks.org/wiki/C/getchar

Znak wprowadzony to kod ASCII wartości: 0-255
Wartość EOF ma wartość... EOF.

Żeby odczytać cyfrę musisz najpierw sprawdzić czy odczytana wartość to EOF czy coś innego (np. znak).
Jeśli nie jest to EOF to możesz interpretować tę wartość jako znak i np. wyświetlić.
Wartość znaków cyfr w ASCII nie powinna Cię interesować - wartość powinieneś porównywać z literałami znakowymi.

Np.

#include <stdio.h>

int main(void) {
	int c;

	while(1) {
		c = getchar();
		if (c == '5') {
		  printf("Mam 5!\n");
		} else if (c == EOF) {
		  printf("To już koniec\n");
		  break;
		} else {
		  printf("Nie wiem co mam zrobić\n");
		}
	}

	return 0;
}

Wynik dla wejścia "53":

Mam 5!
Nie wiem co mam zrobić
To już koniec

https://ideone.com/tmvTTq

Ten kod byłby niepoprawny gdybym zadeklarował c jako char, ponieważ EOF może nie mieścić się w char.
http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=1048865140&id=1043284351

Jak dopiero zaczynasz naukę to poznawaj instrukcje po instrukcji a nie kopiuj całych bloków kodu nie wiadomo skąd (patrz GetStdHandle).

0

Panie Piotrku...
O to mi właśnie chodziło!
Ogromne dzięki!

while(1) {      /*  <<< właśnie tu pies pogrzebany!!!  */
        c = getchar();
        if (c == '5') {
          printf("Mam 5!\n");
        } else if (c == EOF) {                  /* i brak znajomości ELSE też swoje zrobił   */
          printf("To już koniec\n");
          break;
        } else {
          printf("Nie wiem co mam zrobić\n");
        }
    }
0

while(1) { /* <<< właśnie tu pies pogrzebany!!! */

Nieskończona pętla. Wszystko co nie jest zerem jest z automatu równe true.

0

A co zrobić by funkcja nie reagowała na jakiekolwiek inne znaki prócz T i N??

1

Musisz zastosować pętlę do...while

#include <stdio.h>

int main(void) {
	char character = ' ';
	do
	{
		scanf("%c%*c", &character);	
	} while (character == 'n' || character == 't');
	return 0;
}

Lepiej tutaj użyć scanf wraz ignorowaniem znaku nowej linii.
http://stackoverflow.com/questions/7898215/how-to-clear-input-buffer-in-c

0

Ok, tym T/N zaraz się zajmę.
Obecnie program wygląda tak:

#include <stdio.h>
#include <windows.h>
#include <stdlib.h>

int main (void)

{

char* autor = "Gavallona";
 char* opel = "OPEL";
 char* insignia = "INSIGNIA";
 char* astra = "ASTRA";
 char* laguna = "LAGUNA";
 char* opla = "OPLA";
 char* insignie = "INSIGNIE";
 char* astre = "ASTRE";
 char* lagune = "LAGUNE";

HANDLE kolor;
kolor = GetStdHandle( STD_OUTPUT_HANDLE );
SetConsoleTextAttribute( kolor, 4 );
 printf (" ***** ROZPOCZECIE PROGRAMU SAMOCHOD ***** \n\n\n");

 kolor = GetStdHandle( STD_OUTPUT_HANDLE );
SetConsoleTextAttribute( kolor, 7 );

printf(" Witamy w programie: %s \n\n", autor);
 printf(" Moj obecny samochod to: %s %s \n\n", opel, insignia);
 printf(" %s mi sie znudzila i zmienilem na: %s \n" , insignia, astre);
 printf(" %s jednak nie przypadla mi \n do gustu i kupilem nowa: %s \n", astra, lagune);
 printf(" %s okazala sie jednak szrotem i ponownie kupilem %s \n\n", laguna, opla);
 printf(" ***** TERAZ ZMIANA corsa=corsunia ***** \n\n\n");
 char* corsa = "CORSA";
 printf(" Obecnie moj samochod to %s %s \n", opel, corsa);
 corsa = "corsunia";
 printf(" Tak bardzo lubie swojego %s ze nazwalem go %s \n", opla, corsa);
char* corsidlo = "CORSIDLEM";
 printf(" ale nazwa %s okazala sie lipna i nazwalem go %s \n\n\n\n", corsa, corsidlo);
 printf(" Wcisnij dowolny klawisz by kontynuowac! \n\n\n");
getch();

system ("cls");

int liczba = 0;
   printf ("Podaj wiek obecnego auta: ");
   scanf ("%d", &liczba);
   if (liczba < 5)
   printf ("Twoje auto ma %d lat i jest to mlode auto", liczba);
   else if (liczba > 5)
    printf ("Twoje auto ma %d lat i jest to stare auto \n", liczba);
   if (liczba >30)
   printf ("Twoje auto ma %d lat i jest to juz zlom \n\n", liczba);
   printf ("Aby kontynuowac wcisnij dowolny klawisz! \n");
   getch ();
system ("cls");

    printf (" Twoj samochod ma obecnie %d lat \n", liczba);

    int pojemnosc = 0;
   printf (" Podaj pojemnosc silnika w cm3: \n");
   scanf ("%d", &pojemnosc);
   if (pojemnosc < 1500)
   printf ("Twoje auto ma %d cm3 pojemnosci i jest to maly silnik \n", pojemnosc);
   else if (pojemnosc < 2000)
    printf ("Twoje auto ma %d cm3 pojemnosci i jest to klasyczny silnik \n", pojemnosc);
   else if (pojemnosc > 2000)
   printf ("Twoje auto ma %d cm3 pojemnosci i jest to duzy silnik \n\n", pojemnosc);
   printf ("Aby kontynuowac wcisnij dowolny klawisz! \n");
   getch ();

system ("cls");


kolor = GetStdHandle( STD_OUTPUT_HANDLE );
SetConsoleTextAttribute( kolor, 4 );
printf (" ****** PODSUMOWANIE   ****** \n\n\n");

kolor = GetStdHandle( STD_OUTPUT_HANDLE );
SetConsoleTextAttribute( kolor, 7 );

printf (" Na chwile obecna Twoim samochodem jest Opel ktorego nazwales: %s \n", corsidlo);
printf (" Samochod ma obecnie: %d lat \n", liczba);
printf (" %s ma obecnie %d cm3 pojemnosci bo tyle wczesniej podales! \n", corsa, pojemnosc);



   return 0;

}

Z góry przepraszam za tego typu "bezsens" z tymi samochodami ale chodzi tu o to by się uczyć na czymś co działa i się sprawdza nie myśląc o wzorowej i logicznej treści samego programu. Po prostu program robi bzdury ale ważne że je robi :-)

Na chwilę obecną z końcówki programu chciał bym wykonać (zadeklarować) stałe (niezmienne).

printf (" Na chwile obecna Twoim samochodem jest Opel ktorego nazwales: %s \n", corsidlo);
printf (" Samochod ma obecnie: %d lat \n", liczba);
printf (" %s ma obecnie %d cm3 pojemnosci bo tyle wczesniej podales! \n", corsa, pojemnosc);

**
wynikiem tej że końcówki że tak brzydko powiem jest:**

Na chwile obecna Twoim samochodem jest Opel ktorego nazwales: Corsunia
Samochod ma obecnie: 12lat      (przyjmijmy że tyle zapodał user programu)
Corsunia ma obecnie 2500 cm3 pojemnosci bo tyle wczesniej podales.

I teraz z otrzymanych danych, tj. Corsunia (marka) 12 (lat) oraz 2500 (pojemnosci) chciał bym zadeklarować stałe tak by program wykonując dalsze czynności
opierał się tylko i wyłącznie na tych wynikach. Mogę to zrobić za pomocą #DEFINE jako tzw. stała symboliczna czy szukać czegoś innego?

Dalsza część programu będzie na każdej ze stron posiadać w pierwszej linii taki stały wpis:
****** AUTO: CORSUNIA WIEK: 12LAT POJEMNOŚĆ: 2500cm3 *******
Do tego dojdą inne opcje jak kolor, wyposażenie i masa innych ale to będą już dane wybierane z listy bądź wpisywane przez usera.

0

No i znowu się zgubiłem :-) :-)

char c;
    printf ("Podaj swoje imie:");
        scanf ("%s", &c);
        printf ("Twoje imie to: %s",c);

Konsola dęba staje. Gdy zamiast printf użyję putchar() to tak samo.
Całość jest już po "tuningu" i wygląda tak:

/* załączenie bibliotek */

#include <stdio.h>
#include <windows.h>
#include <stdlib.h>

int main (void)

{

/* dane startowe programu oraz menu powitalne */

    char* autor = "Gavallon";
    char* wersja = "v2";
    char* data = "20170421";
    char* nazwa = "Gavallonik";

HANDLE kolor;
        kolor = GetStdHandle( STD_OUTPUT_HANDLE );
            SetConsoleTextAttribute( kolor, 12);

    printf ("\n\n\n");
    printf ("\t ------------------------------------------------------- \n");
    printf ("\t|\t *** Gavallon V2 - Witamy w programie *** \t|\n");
    printf ("\t -------------------------------------------------------\n\n");

        kolor = GetStdHandle( STD_OUTPUT_HANDLE );
            SetConsoleTextAttribute( kolor, 7 );

    printf("\t Autor programu: %s \n", autor);
    printf("\t Wersja programu: %s \n", wersja);
    printf("\t Data utworzenia: %s \n\n\n\n", data);
    printf ("  ----------------------------------------------------------------- \n\n");
    printf ("  Program chcial by zaznajomic sie z uzytkownikiem i w tym celu bedzie wymagal \n");
    printf ("  wprowadzenia odpowiednich danych! \n\n\n");
    printf ("  Aby kontynuowac wcisnij dowolny klawisz!");

    getch();
system ("cls");

/* deklaracje stałych i zmiennych w programie */
/* powtorzenie menu jako stałego elementu w programie */

kolor = GetStdHandle( STD_OUTPUT_HANDLE );
            SetConsoleTextAttribute( kolor, 12);

    printf ("\n\n\n");
    printf ("\t ------------------------------------------------------- \n");
    printf ("\t|\t *** Gavallon V2 - menu pobierania danych *** \t|\n");
    printf ("\t -------------------------------------------------------\n\n");

        kolor = GetStdHandle( STD_OUTPUT_HANDLE );
            SetConsoleTextAttribute( kolor, 7 );


    char c;
    printf ("Podaj swoje imie:");
        scanf ("%s", &c);
        printf ("Twoje imie to: %s",c);


  return 0;

}

Tym razem kombinuję z tym by to użytkownik podał np. imię, markę auta itp. itd.
chcąc później to zamienić na "STAŁE"

3

char c to jeden znak.
scanf("%s" wczytuje ciąg znaków.

char c[100];
4

Dla bezpieczeństwa: scanf("%s") wczyta tyle znaków, ile się mu przekaże, niezależnie od tego, czy zmieszczą się w buforze. Tak więc jeśli nie chcemy, by złośliwy użyszkodnik nam mógł nadpisać coś w pamięci, powinniśmy limitować to wczytywanie, na przykład tak:

char c[50];
scanf("%49s", c);

Dlaczego 49? Bo to 50 - 1, a to 1 odejmujemy dlatego, że na końcu ciągu znaków wyląduje \0, zabierający jedno pole.

0

@Althorion, poprawiłem w kilku miejscach ale wychodzi małe ale.
Gdy odpalisz program i w chwili w której program prosi o Twój wiek - wpiszesz np. 1000 to wychodzą krzaki :-)
w postaci takowej że ten wiek przypisany zostaje do kolejnego zapytania w programie jakim jest "miasto"...
Wpisujesz wiek: 1000 i program zaraz wyświetla miasto: 1000 :-)

Nie wiem gdzie to się ukatrupiło po drodze.

/* załączenie bibliotek */

#include <stdio.h>
#include <windows.h>
#include <stdlib.h>

int main (void)

{

/* dane startowe programu oraz menu powitalne */

    char* autor = "Gavallon";
    char* wersja = "v2.01";
    char* data = "2017.04.21";
    char* nazwa = "Gavallonik";

HANDLE kolor;
        kolor = GetStdHandle( STD_OUTPUT_HANDLE );
            SetConsoleTextAttribute( kolor, 12);

    printf ("\n\n\n");
    printf ("\t ------------------------------------------------------- \n");
    printf ("\t|\t *** Gavallon V2 - Witamy w programie *** \t|\n");
    printf ("\t -------------------------------------------------------\n\n");

        kolor = GetStdHandle( STD_OUTPUT_HANDLE );
            SetConsoleTextAttribute( kolor, 7 );

    printf("\t Autor programu: %s \n", autor);
    printf("\t Wersja programu: %s \n", wersja);
    printf("\t Data utworzenia: %s \n\n\n\n", data);
    printf ("  ----------------------------------------------------------------- \n\n");
    printf ("  Program chcial by zaznajomic sie z uzytkownikiem i w tym celu bedzie wymagal \n");
    printf ("  wprowadzenia odpowiednich danych! \n\n\n");
    printf ("  Aby kontynuowac wcisnij dowolny klawisz!");

    getch();
system ("cls");

/* deklaracje stałych i zmiennych w programie */
/* powtorzenie menu jako stałego elementu w programie */

kolor = GetStdHandle( STD_OUTPUT_HANDLE );
            SetConsoleTextAttribute( kolor, 12);

    printf ("\n\n\n");
    printf ("\t ------------------------------------------------------- \n");
    printf ("\t|\t *** Gavallon V2 - menu pobierania danych *** \t|\n");
    printf ("\t -------------------------------------------------------\n\n");

        kolor = GetStdHandle( STD_OUTPUT_HANDLE );
            SetConsoleTextAttribute( kolor, 7 );
/* pobieranie danych od użytkownika */

    char imie [100];
    printf ("Podaj swoje imie: \n");
        scanf ("%s", &imie);
        printf ("Twoje imie to: %s \n",imie);

    char wiek [3];
    printf ("Podaj swoj wiek: \n");
        scanf ("%2", &wiek);
        printf ("Masz %s lat(a) \n",wiek);

    char miasto [30];
    printf ("Podaj nazwe miasta w ktorym mieszkasz: \n");
        scanf ("%29s", &miasto);
        printf ("Twoja miejscowosc to: %s \n\n",miasto);

        printf(" Program zebral juz potrzebne dane!\n");
        printf(" Masz na imie %s, masz %s lat(a) a Twoja miejscowosc to: %s \n\n", imie, wiek, miasto);

/* zmiana koloru dla komunikatu z ID użytkownika */
        kolor = GetStdHandle( STD_OUTPUT_HANDLE );
            SetConsoleTextAttribute( kolor, 10);

            printf ("Od tej pory bedziesz tak identyfikowany(a)! \n");
            printf ("Aby zmienic powyzsze dane - zamknij i uruchom ponownie program \n");
            printf ("Aby kontynuowac z aktualnymi danymi wcisnij dowolny klawisz...");
            kolor = GetStdHandle( STD_OUTPUT_HANDLE );
            SetConsoleTextAttribute( kolor, 7 );

            /* w późniejszym czasie zostanie dodana pętla do poprawy danych oraz zapytanie KONTYNUOWAC T/N?  */
            getch();
system ("cls");

   /* strona startowa z ID usera - zwane dalej MENU */

    kolor = GetStdHandle( STD_OUTPUT_HANDLE );
            SetConsoleTextAttribute( kolor, 12);

    printf ("\n\n\n");
    printf ("\t ------------------------------------------------------- \n");
    printf ("\t|\t *** Gavallon V2 -                   *** \t|\n");
    printf ("\t ------------------------------------------------------- \n");

        kolor = GetStdHandle( STD_OUTPUT_HANDLE );
            SetConsoleTextAttribute( kolor, 10 );
        /* dane użytkownika pod menu */

        printf ("\tUzytkownik: %s \n \tMiejscowosc: %s \n \tWiek: %s \n\n\n\n", imie, miasto, wiek);

        kolor = GetStdHandle( STD_OUTPUT_HANDLE );
            SetConsoleTextAttribute( kolor, 7 );

/* zaczynamy zbierac dane na temat posiadanego samochodu */

    printf("W tej chwili program zacznie zbierac dane dot. Twojego pojazdu \n");

        char marka [15];
            printf ("Podaj marke pojazdu: \n");
                scanf ("%14s", &marka);
        char model [15];
            printf ("Podaj model pojazdu: \n");
                scanf ("%14s", &model);
        char tablice [10];
            printf ("Podaj numer rejestracyjny: \n");
                scanf ("%9s", &tablice);
        char d_produkcji [5];
            printf ("Rok produkcji: \n");
                scanf ("%4s", &d_produkcji);
        char d_badan [10];
            printf ("Wpisz date waznosci badan technicznych w formacie YYYYMMDD: \n");
                scanf ("%9s", &d_badan);
        char przebieg [10];
            printf ("Wpisz aktualny przebieg auta: \n");
                scanf ("%9s", &przebieg);

                /* podsumowanie danych pojazdu użytkownika */
                kolor = GetStdHandle( STD_OUTPUT_HANDLE );
                    SetConsoleTextAttribute( kolor, 10 );
                printf("Program zanotowal ponizsze dane: \n");
                kolor = GetStdHandle( STD_OUTPUT_HANDLE );
                    SetConsoleTextAttribute( kolor, 7 );
                printf("Marka: %s \n", marka);
                printf("Model: %s \n", model);
                printf("Numer rejestracyjny: %s \n", tablice);
                printf("Aktualny przebieg: %s \n", przebieg);
                printf("Rocznik: %s \n\n\n\n", d_produkcji);
                printf("Od tej chwili dane pojazdu sa przypisane do Twojego imienia! \n");
                printf("Wcisnij dowolny klawisz by kontynowac!");
                getch();

system ("cls");

/* dopisanie danych o pojezdzie do tzw. MENU */

    kolor = GetStdHandle( STD_OUTPUT_HANDLE );
            SetConsoleTextAttribute( kolor, 12);

    printf ("\n\n\n");
    printf ("\t ------------------------------------------------------- \n");
    printf ("\t|\t *** Gavallon V2 -                   *** \t|\n");
    printf ("\t ------------------------------------------------------- \n");

        kolor = GetStdHandle( STD_OUTPUT_HANDLE );
            SetConsoleTextAttribute( kolor, 10 );
        /* dane użytkownika pod menu */

        printf ("\tUzytkownik: %s \n \tMiejscowosc: %s \n \tWiek: %s \n", imie, miasto, wiek);
        printf ("\tMarka pojazdu: %s \n \tModel: %s \n \tData produkcji: %s \n \tNumer rejestracyjny: %s \n \tPrzebieg: %s KM \n", marka, model, d_produkcji, tablice, przebieg);

        kolor = GetStdHandle( STD_OUTPUT_HANDLE );
            SetConsoleTextAttribute( kolor, 7 );





return 0;

}

a tak na marginesie to fajnie się to pisze i utrwala to co już się umie lecz nie był bym sobą gdybym powiedział że to jest to o co mi chodzi w 100%.
Problemem jest to że ... gdy wyłączymy program to on nie pamięta jakichkolwiek danych.
Miło by było by w przyszłości taką opcję jednak miał ale to nie ta liga chyba jeszcze :-) z moją zawartością wiedzy.

1

@twonek, no jest teraz style:file


/* załączenie bibliotek */

#include <stdio.h>
#include <windows.h>
#include <stdlib.h>

int main(void)

{

    /* dane startowe programu oraz menu powitalne */

    char* autor = "Gavallon";
    char* wersja = "v2.01";
    char* data = "2017.04.21";
    char* nazwa = "Gavallonik";

    HANDLE kolor;
    kolor = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(kolor, 12);

    printf("\n\n\n");
    printf("\t ------------------------------------------------------- \n");
    printf("\t|\t *** Gavallon V2 - Witamy w programie *** \t|\n");
    printf("\t -------------------------------------------------------\n\n");

    kolor = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(kolor, 7);

    printf("\t Autor programu: %s \n", autor);
    printf("\t Wersja programu: %s \n", wersja);
    printf("\t Data utworzenia: %s \n\n\n\n", data);
    printf("  ----------------------------------------------------------------- \n\n");
    printf("  Program chcial by zaznajomic sie z uzytkownikiem i w tym celu bedzie wymagal \n");
    printf("  wprowadzenia odpowiednich danych! \n\n\n");
    printf("  Aby kontynuowac wcisnij dowolny klawisz!");

    getch();
    system("cls");

    /* deklaracje stałych i zmiennych w programie */
    /* powtorzenie menu jako stałego elementu w programie */

    kolor = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(kolor, 12);

    printf("\n\n\n");
    printf("\t ------------------------------------------------------- \n");
    printf("\t|\t *** Gavallon V2 - menu pobierania danych *** \t|\n");
    printf("\t -------------------------------------------------------\n\n");

    kolor = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(kolor, 7);
    /* pobieranie danych od użytkownika */

    char imie[100];
    printf("Podaj swoje imie: \n");
    scanf("%s", &imie);
    printf("Twoje imie to: %s \n", imie);

    char wiek[3];
    printf("Podaj swoj wiek: \n");
    scanf("%2s", &wiek);
    printf("Masz %s lat(a) \n", wiek);

    char miasto[30];
    printf("Podaj nazwe miasta w ktorym mieszkasz: \n");
    scanf("%29s", &miasto);
    printf("Twoja miejscowosc to: %s \n\n", miasto);

    printf(" Program zebral juz potrzebne dane!\n");
    printf(" Masz na imie %s, masz %s lat(a) a Twoja miejscowosc to: %s \n\n", imie, wiek, miasto);

    /* zmiana koloru dla komunikatu z ID użytkownika */
    kolor = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(kolor, 10);

    printf("Od tej pory bedziesz tak identyfikowany(a)! \n");
    printf("Aby zmienic powyzsze dane - zamknij i uruchom ponownie program \n");
    printf("Aby kontynuowac z aktualnymi danymi wcisnij dowolny klawisz...");
    kolor = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(kolor, 7);

    /* w późniejszym czasie zostanie dodana pętla do poprawy danych oraz zapytanie KONTYNUOWAC T/N?
     */
    getch();
    system("cls");

    /* strona startowa z ID usera - zwane dalej MENU */

    kolor = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(kolor, 12);

    printf("\n\n\n");
    printf("\t ------------------------------------------------------- \n");
    printf("\t|\t *** Gavallon V2 -                   *** \t|\n");
    printf("\t ------------------------------------------------------- \n");

    kolor = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(kolor, 10);
    /* dane użytkownika pod menu */

    printf("\tUzytkownik: %s \n \tMiejscowosc: %s \n \tWiek: %s \n\n\n\n", imie, miasto, wiek);

    kolor = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(kolor, 7);

    /* zaczynamy zbierac dane na temat posiadanego samochodu */

    printf("W tej chwili program zacznie zbierac dane dot. Twojego pojazdu \n");

    char marka[15];
    printf("Podaj marke pojazdu: \n");
    scanf("%14s", &marka);
    char model[15];
    printf("Podaj model pojazdu: \n");
    scanf("%14s", &model);
    char tablice[10];
    printf("Podaj numer rejestracyjny: \n");
    scanf("%9s", &tablice);
    char d_produkcji[5];
    printf("Rok produkcji: \n");
    scanf("%4s", &d_produkcji);
    char d_badan[10];
    printf("Wpisz date waznosci badan technicznych w formacie YYYYMMDD: \n");
    scanf("%9s", &d_badan);
    char przebieg[10];
    printf("Wpisz aktualny przebieg auta: \n");
    scanf("%9s", &przebieg);

    /* podsumowanie danych pojazdu użytkownika */
    kolor = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(kolor, 10);
    printf("Program zanotowal ponizsze dane: \n");
    kolor = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(kolor, 7);
    printf("Marka: %s \n", marka);
    printf("Model: %s \n", model);
    printf("Numer rejestracyjny: %s \n", tablice);
    printf("Aktualny przebieg: %s \n", przebieg);
    printf("Rocznik: %s \n\n\n\n", d_produkcji);
    printf("Od tej chwili dane pojazdu sa przypisane do Twojego imienia! \n");
    printf("Wcisnij dowolny klawisz by kontynowac!");
    getch();

    system("cls");

    /* dopisanie danych o pojezdzie do tzw. MENU */

    kolor = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(kolor, 12);

    printf("\n\n\n");
    printf("\t ------------------------------------------------------- \n");
    printf("\t|\t *** Gavallon V2 -                   *** \t|\n");
    printf("\t ------------------------------------------------------- \n");

    kolor = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(kolor, 10);
    /* dane użytkownika pod menu */

    printf("\tUzytkownik: %s \n \tMiejscowosc: %s \n \tWiek: %s \n", imie, miasto, wiek);
    printf("\tMarka pojazdu: %s \n \tModel: %s \n \tData produkcji: %s \n \tNumer rejestracyjny: "
           "%s \n \tPrzebieg: %s KM \n",
        marka, model, d_produkcji, tablice, przebieg);

    kolor = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(kolor, 7);


    return 0;
}

Dziwnie mi się to teraz czyta.

1

Przyszła w końcu ta książka do C :-) (S.Prata, Szkoła Programowania, 2016, wyd.6). Mieliście rację że z archaików to się człowiek niczego nie nauczy.
1024 strony kontra 200-300 robi swoje. Wszystko jak na dłoni. Milknę zatem na kilka dzionków i odezwę się jak "przytuninguję" w/w pseudo programik.

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