Skocz do zawartości

KTORYS Z KOLEI BLAD c / c++ kto to wymyslil? ;]


Specter

Recommended Posts

#include <stdio.h>
char jeden_znak;
while(1) {
printf("napisz znak");
scanf("%c",&jeden_znak);
printf("%c",jeden_znak);
}

// program dzialacacy //
napisz znak
a
a
napisz znak
sadsagfd
sadsagfd
napisz znak
fsaf23jkhbr38u7hdsafjkb4p9sbkjfndwaefsadf
fsaf23jkhbr38u7hdsafjkb4p9sbkjfndwaefsadf
// koniec //

wie ktos dlaczego %c - jako jeden znak i char zna; jako jeden znak wypisuje i pobiera wiecej?? jak to jeden znak?? i pobiera wiecej wie ktos co tu jest grane?? (do pobrania powiedzmy ze to jest & czyli wskanik jagby czyli pamiec wydluza wiecej niz jeden ale printf {%c} jako jeden znak wypisuje wszytkie?? czego to wina?? wie ktos??

drugie pyt

char *bla[3] =
// lub //
char *bla[3];
bla = {"dassafdsa","fdsafdas","adsfasd"};

wypisuje mi bla brak } czy za duzo o } ale czemu jest blad to jet dobrze

:(:(:(:(

Link do komentarza
Udostępnij na innych stronach

scanf("%c",&jeden_znak);
printf("%c",jeden_znak);

Scanf najpierw zapisuje do bufora wszystkie wpisane znaki (po nacisnieciu entera),
następnie formatuje bufor by pasował do konkretnego typu zmiennej (jeśli podaliśmy %d - do int, jeśli %c - do char).

Scanf nie sprawdza czy przepisywana ilość znaków z bufora zmieści się w zmiennej, czy nie.
Jeśli się nie zmieści, to informacje zostają zapisane w losowym miejscu w pamięci.

Może się zdarzyć, że zapiszą się w miejscu gdzie np. zawarta jest informacja o innej zmiennej.

Jest to bardzo niebezpieczne i często trudne do wykrycia w złożonym programie. :!:

I jeszcze jedno: dla printf nie ma znaczenia, gdzie w pamięci została zapisana zmienna, po prostu ją wyświetla.

Link do komentarza
Udostępnij na innych stronach

char *bla[3] = 
// lub // 
char *bla[3]; 
bla = {"dassafdsa","fdsafdas","adsfasd"}; 

Dopuszczalne jest tylko char *bla[3] = {"aadfsdf","asdasd","asgg" } , czyli przy deklaracji następuje inicjalizacja zmiennej.

Wówczas do tablicy zostaje odpowiednio wpisane i zakonczone znakiem NULL ciągi znaków.

Jeśli chcesz zrobić char *bla[3] , a później dopiero wpisać tam wartości to niestetu musisz iść po kolei indeksami:

strcpy (bla[0], "sdasdsad");
strcpy (bla[1], "sdsfasfa");
strcpy (bla[2], "ssafasfsa");

lub po wskaźnikach:

strcpy (*bla, "sadasfsaf");
strcpy (*(++bla), "sadasfsaf");
strcpy (*(++bla), "sadasfsaf");

Wykorzystuję funkcję strcpy(char* cel, char* źródło)

W języku C i C++ nie można przypisać bezpośrednio ciągu znaków do zmiennej typu char*, czyli
bla[0] = "cos-tam";, możliwe to jest tylko przy deklaracji.

Link do komentarza
Udostępnij na innych stronach

getch() umożliwia wczytywanie znaków w sposób niebuforowany.

Sama instrukcja wczytuje tylko jeden znak i zwraca jego wartość. By wczytać więcej znaków, trzeba ją powtórzyć np:

int znak;
int i = 0;
char bufor[30];

While( (znak = getch()) != '\n')
{
bufor[i++] = znak;
}

Czekamy na znak, wczytujemy znak naciśnięty przez użytkownika, zapisujemy w tablicy i znów... aż do naciśnięcia klawisza Enter
Należy włączyć oczywiście plik nagłówkowy <conio.h>

Link do komentarza
Udostępnij na innych stronach

  • 2 weeks later...

Tu patrzec tu tu tu :D :P

Takie pytanie;
unsigned int cos; // znaczy ze bez znaku
cos = -1; // ze znakiem nie zgodne
printf("%d",cos) // drukuje ze znakiem 9_9 :/ :!: 8) :) 

Wie ktos jak sie przed tym ustrzec ?? :/ :D zeby bylo zawsze bez znaku ;]

specjalnie sie wrocilem na forum zeby tu napisac to: nie chce zadnych sposob jak
if(liczba_bez_znaku < 0) liczba_bez_znaku * -1 :)  :!: :D

tak przy okazji sie zapytam zna ktos lagorytm na sito arystotelesa dobre?? oraz na lsite 2kierunkowa?? bo kurcze robie to i robie i nic :/

Link do komentarza
Udostępnij na innych stronach

  • No wiem

no ;] ale qrcze w tedy nie myslalem o tym a ten topic ma juz troche czasu, a skopiowac(przeniesc) nie umiem (nie mam uprawnien do tego), a ze dopiero jak ktos ostanio mi tu wzrocil uwego niew iem ty czy ktos nie chce mi sie szukac :P zaczolem na to zwracac uwage ale topicc byl juz od dawna wiec tylko dopisalem do niego ta notke ... o wiecej ;) wiec odpowiedz ine ;) chyba ze pinolec lub ktos inny przeniesie nie bede mial za zle :) tylko nie usuwac :P poprostu przeniesc :D

Link do komentarza
Udostępnij na innych stronach

  • 2 months later...
  • 3 months later...

Deklarując zmienną jako unsigned dajesz kompilatorowi do zrozumienia jakich operacji ma używać (np. przy porównywaniu lub przy mnożeniu).
Np:

int i = -1; //hex = 0xffffffff
unsigned int j = -1; //hex = 0xffffffff

Jak widać nie ma różnicy pomiędzy binarnymi rozwinięciami tych liczb, a funkcja printf domyślnie uważa, że %d oznacza signed int. Ale jest chyba jakiś format dla unsigned, poszukaj w helpie.

Link do komentarza
Udostępnij na innych stronach

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gość
Odpowiedz...

×   Wkleiłeś zawartość bez formatowania.   Usuń formatowanie

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Utwórz nowe...