Skocz do zawartości

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


Recommended Posts

Napisano

#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

:(:(:(:(

Napisano

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.

Napisano
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.

Napisano

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>

  • 2 weeks later...
Napisano

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 :/

Napisano

Czakol: już drugi raz odkąt ja jestem na forum zaczoles nowy topic w zlym dziale.
To o co pytales to dotyczy języka C/C++ wiec nie rozumie czemu ten temat jest w tym dziale.

Napisano
  • 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

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

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.

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...