132
ROZDZIAŁ 18. SA PISY
Warto zaznaczyć, że znak nowej linii (’\n') jest w różny sposób przechowywany w różnych systemach operacyjnych. Wiąże się to z pewnymi historycznymi uwarunkowaniami. W niektórych systemach używa się <lo tego jednego znaku o kodzie OxOA (Linę Feed — nowa linia). Do tej rodziny zaliczamy systemy z rodziny Unix: Linux. *I)SI). Mac OS X inne. Drugą konwencją jest zapisywanie ’\n' za |M>mocą dwóch znaków: LF (Linę Feed) + CR (Carriage return powrót karetki). Znak CR reprezentowany jest przez wartość QxOD. Kombinacji tych dwóch znaków używają m.in.: CP/M. DOS, OS/2, Microsoft Windows. Trzecia grupa systemów używa do tego celu samego znaku CR. Są to systemy działające na komputerach Commodore, Apple li oraz Mac OS do wersji 9. W związku z tym plik utworzony w systemie Linux może* wyglądać dziwnie pod systemem Windows.
Napisy to tak naprawdę w-skaźniki. Tak więc używając zwykłego operatora porównania ==, otrzymamy wynik porównania adresów a nie tekstów.
Do porównywania dwóch ciągów znaków należy użyć funkcji strcmp zadeklarowanej w pliku nagłówkowym string.h. Jako argument przyjmuje ona dwa napisy i zwraca wartość ujemną jeżeli napis pierwszy jest mniejszy od drugiego, 0 jeżeli napisy są równe lub wartość' dodatnią jeżeli napis pierwszy jest większy od drugiego. Ciągi znaków porównywalne są leksykalnie kody znaków, czyli np. (przyjmując kodowanie ASCII) a jest mniejsze od b, ale jest większe od B. Np.:
sinclude <stdio.h> sinclude <string.h>
int main(void) {
char strl[100], str2[100]; int cmp;
putsCPodaj dwa ciągi znakou: "); fgets(strl, siz«of strl, stdin); fgets(str2, sizeof str2, stdin);
cmp - strcnp(strl, str2); if (cnp<0) {
puts("Pierwszy napis jest mniejszy.");
> else if (cmp>0) {
puts("Pierwszy napis jest większy.");
> else {
puts("Napisy sa takie same.”);
>
return 0;
)
Czasami możemy chcieć porównać tylko fragment napisu, np. sprawdzić czy zaczyna się od jakiegoś ciągu. W takich sytuacjach pomocna jest funkcja strncmp. W porównaniu do strcmpO przyjmuje ona jeszcze jeden argument oznaczający maksymalną liczbę znaków do porównania:
•include <stdio.h> Sinclude <string.h>