[ Pobierz całość w formacie PDF ]

freopen():
FILE *freopen(const char *nazwa, const char *tryb, FILE *fp);
D:\KISIU\PDFy\Chudy\Ksią\ki\Hack_Wars_Tom_1\Hack_Wars_Tom_1\06.doc 241
242 Hack Wars. Tom 1. Na tropie hakerów
Funkcja zamyka strumień istniejący i podejmuje próbę jego ponownego otwarcia przy
u\yciu podanej nazwy pliku. Znajduje to zastosowanie przy przekierowywaniu
strumieni predefiniowanych stdin, stdout i stderr do pliku lub urządzenia.
Przykładowo, gdy pojawia się potrzeba przekierowania wszystkich danych
wyjściowych kierowanych do stdout na drukarkę, mo\na u\yć polecenia:
freopen("LPT1","w",stdout);
Predefiniowane strumienie we-wy
Wstępnie zdefiniowane zostały trzy strumienie we-wy: stdin, stdout i stderr.
Domyślnie stdin i stdout odpowiadają klawiaturze i monitorowi. Na wielu
platformach, w tym systemów DOS i UNIX, dostępna jest mo\liwość ich
przekierowania. Strumień stderr domyślnie powiązany jest z monitorem
(wyświetlaczem). Praktyka jego przekierowywania nie jest raczej stosowana. Jego
podstawowym zadaniem jest zapewnienie mo\liwości wyświetlania komunikatów
błędów, nawet w sytuacji gdy powiązanie standardowego wyjścia (stdout) zostało
zmienione:
fputs("Komunikat o błędzie", stderr);
Funkcje printf() i puts() przekazują dane do strumienia stdout. Funkcje
scanf() i gets() pobierają dane ze strumienia stdin. Przekierowanie tych
strumieni zmienia sposób działania funkcji.
Jako przykład plikowych operacji we-wy na platformie PC, korzystających z
mo\liwości przekierowania strumieni, przedstawimy prosty program przesyłający do
strumienia stdout zawartość określonego pliku, przedstawioną jako wartości
szesnastkowe. Polecenie w postaci:
dump nazwa_pliku.xxx > dane_wyjściowe.xxx
pozwoli zmienić domyślne powiązanie strumienia stdout z monitorem.
#include
#include
#include
#include
main(int argc, char *argv[])
{
unsigned licznik;
unsigned char v1[20];
int f1;
int x;
int n;
if (argc != 2)
{
fputs("\nBAD. Poprawna składnia wywołania: dump f1\n",stderr);
return(1);
}
f1 = open(argv[1],O_RDONLY);
if (f1 == -1)
{
242 D:\KISIU\PDFy\Chudy\Ksią\ki\Hack_Wars_Tom_1\Hack_Wars_Tom_1\06.doc
Rozdział 6. f& 243
f& Podstawy programowania dla hakerów
f&
f&
fprintf(stderr, "\nBAD. Nie mo\na otworzyć %s\n",argv[1]);
return(1);
}
fprintf(stdout,"\nZAWARTOZ PLIKU %s\n\n",strupr(argv[1]));
licznik = 0;
while(1)
{
/* Wypełnienie bufora zerami */
memset(v1,0,20);
/* Pobranie do bufora danych z pliku */
x = _read(f1,&v1,16);
/* x = 0 to EOF, x = -1 oznacza błąd */
if (x
break;
/* Wyprowadz offset w pliku */
fprintf(stdout,"%06d(%05x) ",licznik,licznik);
licznik +=16;
/* Wyprowadz szesnastkowe wartości bajtów z bufora */
for(n = 0; n
fprintf(stdout,"%02x ",v1[n]);
/* Wyprowadz wartości ASCII bajtów z bufora */
for(n = 0; n
{
if ((v1[n] > 31) && (v1[n]
fprintf(stdout,"%c",v1[n]);
else
fputs(".",stdout);
}
/* Zakończ znakiem nowego wiersza */
fputs("\n",stdout);
}
/* zakończenie normalne */
return(0);
}
Ciągi
Język C nale\y do najlepiej wyposa\onych w funkcje obsługi ciągów pośród
uniwersalnych języków programowania. Ciąg to jednowymiarowa tablica znaków
zakończona bajtem zerowym. Ciągi mo\na inicjować dwoma sposobami. Pierwszym
jest nadanie im stałej wartości w kodzie programu:
int main()
{
char *p = "System 5";
char nazwa[] = "Program testowy";
return(0);
}
D:\KISIU\PDFy\Chudy\Ksią\ki\Hack_Wars_Tom_1\Hack_Wars_Tom_1\06.doc 243
244 Hack Wars. Tom 1. Na tropie hakerów
Drugi to utworzenie ciągu w czasie wykonywania programu za pomocą funkcji
strcpy():
char *strcpy(char *cel,const char *zródło);
Funkcja strcpy() kopiuje ciąg zródłowy do lokalizacji docelowej, na przykład:
#include
int main()
{
char nazwa[50];
strcpy(nazwa,"Servile Software");
printf("\nWartość ciągu 'nazwa' to %s",nazwa);
return 0;
}
Język C umo\liwia bezpośredni dostęp do ka\dego bajtu ciągu:
#include
int main()
{
char nazwa[50];
strcpy(nazwa,"Servile Software");
printf("\nWartość ciągu 'nazwa' to %s",nazwa);
/* Zastąpienie pierwszego bajtu literą 's' */
nazwa[0] = 's';
printf("\nWartość ciągu 'nazwa' to %s",nazwa);
return 0;
}
Niektóre kompilatory C wyposa\one zostały w funkcje konwersji ciągów do wielkich
i małych liter, nie obejmuje ich jednak norma ANSI. W specyfikacji pojawiają się za
to funkcje toupper() i tolower(), zwracające pojedynczy znak ( w postaci wartości
int) zamieniony na literę wielką lub małą. Aatwo na tej podstawie utworzyć własne
funkcje konwersji ciągów:
#include
void strupr(char *zrodlo)
{
char *p;
p = zrodlo;
while(*p)
{
if((*p)>=97 && (*p)
*p = toupper(*p);
p++;
}
}
void strlwr(char *zrodlo)
244 D:\KISIU\PDFy\Chudy\Ksią\ki\Hack_Wars_Tom_1\Hack_Wars_Tom_1\06.doc
Rozdział 6. f& 245
f& Podstawy programowania dla hakerów
f&
f&
{
char *p;
p = zrodlo;
while(*p)
{
if((*p)>=65 && (*p)
*p = tolower(*p);
p++;
}
}
int main()
{
char nazwa[50];
strcpy(nazwa,"Servile Software");
printf("\nWartość ciągu 'nazwa' to %s",nazwa);
strupr(nazwa);
printf("\nWartość ciągu 'nazwa' to %s",nazwa);
strlwr(nazwa);
printf("\nWartość ciągu 'nazwa' to %s",nazwa);
return 0;
}
(To niezupełnie tak. Funkcje toupper i tolower tworzą litery wielkie
i małe nie sprawdzając, jaka jest postać zródłowa. Konwersja odbywa
się odpowiednio poprzez odjęcie lub dodanie do wartości znaku 32 (bo
taka jest ró\nica pomiędzy odpowiadającymi sobie literami wielkimi i
małymi). Jeśli argument funkcji toupper będzie ju\ literą wielką,
wynik konwersji oka\e się bezsensowny. W tym przypadku  S zostanie
zamienione na  3 ). W funkcjach strlwr i strupr potrzebne byłoby więc
sprawdzanie, czy znak spełnia kryteria, np.:
while (*p)
{
if((*p)>=97 && (*p)
*p = toupper(*p);
p++;
}
oraz
while (*p)
{
if((*p)>=65 && (*p)
*p = tolower(*p);
p++;
}
Dodatkowe linie programu wstawiłem w kod P.B.).
W przeciwieństwie do innych języków programowania C nie narzuca ograniczenia
długości ciągu. Jednak w przypadku niektórych procesorów (CPU) pojawia się
ograniczenie wielkości bloku pamięci. Oto prosty program odwracający kolejność
znaków w ciągu:
#include
#include
D:\KISIU\PDFy\Chudy\Ksią\ki\Hack_Wars_Tom_1\Hack_Wars_Tom_1\06.doc 245
246 Hack Wars. Tom 1. Na tropie hakerów
char *strrev(char *s)
{
/* Odwraca kolejność znaków w ciągu, pozostawiając jedynie */
/* końcowy znak NULL */
char *pocz;
char *koniec;
char tmp;
/* Ustaw wskaznik 'koniec' na ostatni znak ciągu */
koniec = s + strlen(s) - 1;
/* Zabezpiecz wskaznik do początku ciągu */
pocz = s;
/* Zamiana */
while(koniec >= s)
{
tmp = *koniec;
*koniec = *s;
*s = tmp;
koniec--;
s++;
}
return(pocz);
}
void main()
{
char tekst[100];
char *p;
strcpy(tekst,"To jest ciąg");
p = strrev(tekst);
printf("\n%s",p);
}
strtok() [ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • galeriait.pev.pl
  •