Wyklad 8 - napisy, WIT, Semestr II, Podstawy Programowania C

[ Pobierz całość w formacie PDF ]
Podstawy programowania. Wykład 8 – napisy
Małgorzata Nalbach-Moszyńska
9
Napisy w stylu C (łańcuchy) .............................................................................................. 2
9.1
Czytanie napisów......................................................................................................... 3
9.2
Czytanie wierszami – gets() i fgets() ........................................................................... 4
9.3
Funkcje operujące na napisach .................................................................................... 5
1
Podstawy programowania. Wykład 8 – napisy
Małgorzata Nalbach-Moszyńska
9 Napisy w stylu C (łańcuchy)
Napis (łańcuch) – ciąg znaków przechowywany w kolejnych bajtach pamięci i
zakończony znakiem '\0'.
Zajmiemy się łańcuchami w stylu C.
Stałe:
"napis",
reprezentacja w pamięci komputera:
n
a
p
i
s
'\0'
Zmienne:
Deklaracja jako tablica typu char.
char nap[6] = "napis";
char nap[] = "napis"; /* kompilator sam wylicza wielkość na 6 */
char nap[6] = { 'n','a','p','i','s','\0'};
Maksymalna długość napisu przechowywanego w tablicy o długości N to N-1 !
Przykład 1
/* w8p1.cpp -- zapis lancuchow w tablicy */
#include <stdio.h>
int strlen (char napis[]){
/* oblicza dlugosc napisu; */
int len = 0;
int i;
for (i = 0; napis[i]!='\0'; ++i) ++len;
return len;
}
int main()
{
const int Size = 15;
char name1[Size]; /* pusta tablica */
char name2[] = "C Szkola programowania"; /* tablica
zainicjowana */
/* UWAGA: w niektórych implementacjach, aby zainicjować
tablicę name2, konieczne moze byc uzycie słowa
kluczowego static */
2
 Podstawy programowania. Wykład 8 – napisy
Małgorzata Nalbach-Moszyńska
printf( "Czesc! Jestem %s!" , name2);
printf( " A jak ty sie nazywasz?\n");
scanf("%s", name1);
printf( "No tak, %s, Twoje imie ma %d liter i jest
zapisane\n",
name1, strlen(name1));
printf( "w tablicy majacej %d bajtow.\n", sizeof(name1));
/* sizeof podaje dl. całej tablicy */
printf( "Twoj inicjal to %c.\n", name1[0]);
name2[3] = '\0'; /* znak NUL - konczy napis */
printf( "Pierwsze trzy znaki tytulu ksiazki to: %s\n",
name2 );
return 0;
}
9.1 Czytanie napisów
Przykład 2
/* w8p2.c -- odczyt wiecej niz jednego lancucha */
#include <stdio.h>
#include <string.h> /* prototypy funkcji do napisów */
int main()
{
const int ArSize = 20;
char name[ArSize];
char dessert[ArSize];
printf("Jak sie nazywasz? ");
scanf("%s", name);
printf("Twoje imie ma %d liter.\n", strlen(name));
printf("Podaj nazwe swojego ulubionego deseru: " );
scanf("%s",dessert);
printf("\nMam dla Ciebie %s", dessert);
printf(", %s.\n", name);
return 0;
}
Instrukcja
scanf("%s", name);
czyta napis do pierwszej spacji (ogólniej blank character).
Nie da się jedną instrukcją przeczytać kilku wyrazów!
3
Podstawy programowania. Wykład 8 – napisy
Małgorzata Nalbach-Moszyńska
Funkcja
isblank
zwraca wartość !=0, gdy argument jest znakiem typu blank i 0 w
przeciwnym przypadku.
#include <ctype.h> /* isblank */
int isblank(int znak);
Co się stanie, jeśli wyraz na wejściu będzie dłuższy niż tablica?
9.2 Czytanie wierszami – gets() i fgets()
Składnia
char *gets
(<nazwa tablicy >);
Działanie:
Znaki z wejścia umieszcza w tablicy <nazwa tablicy>. Kończy z końcem wiersza. Na końcu
wstawia znak '\0 ' (usuwa znak nowego wiersza '\n ').
Zwraca wskaźnik do tablicy lub NULL w przypadku błędu lub EOF.
Trzeba zadbać o to by tablica miała odpowiednią wielkość. Funkcja nie wykrywa
przekroczenia długości tablicy.
Składnia
fgets
(<nazwa tablicy >, <maks liczba znaków>, <nazwa pliku>);
Działanie:
Znaki z wejścia umieszcza w tablicy <nazwa tablicy>. Kończy z końcem wiersza lub z
przeczytaniem
<maks liczba znaków>-1
znaków. Na końcu wstawia znak '\0 '.
Niestety nie usuwa znaku końca wiersza '\n '.
/* w8p3.cpp -- wczytanie za pomocą gets nie tylko pojedynczych
słów */
#include <stdio.h>
int main()
{
const int ArSize = 20;
char name[ArSize];
char dessert[ArSize];
printf("Podaj swoje imie i nazwisko: ");
gets(name); /* wczytuje dane do znaku nowego wiersza */
printf("Podaj swoj ulubiony deser: ");
gets(dessert);
printf("Mam dla ciebie %s", dessert);
printf(", %s.\n", name);
return 0;
}
4
Podstawy programowania. Wykład 8 – napisy
Małgorzata Nalbach-Moszyńska
9.3 Funkcje operujące na napisach
Istnieją bibliotece <string.h>
Jak są zaimplementowane?
#include <stdio.h>
int strlen (char *napis){
/* oblicza dlugosc napisu bez końcowego 0*/
int len = 0;
for (; *napis++!='\0'; ) ++len;
return len;
}
char *strcpy (char *nap1, char *nap2){
/*kopiuje nap2 do nap1; wynik w nap1. NIE REZERWUJE PAMIECI!
*/
char *pom = nap1;
int dl = strlen(nap2);
int i;
for(i = 1; i<= dl+1; ++i) {
*nap1++ = *nap2++;
printf( "i = %d, nap1 = <<%s>>, nap2 = <<%s>>\n", i, pom,
nap2);
/* wydruk kontrolny, żeby mieć pewność, co się dzieje */
}
return pom;
}
char *strcat (char *nap1, char *nap2){
/* umieszcza w nap1 konkatenację nap1 z nap2; wynik w nap1.
NIE REZERWUJE PAMIECI! */
/* nap1 musi mieć dostatecznie dużo miejsca! */
char *pom = nap1;
char *pom2 = nap2;
while (*pom++ != '\0'); /* teraz pom wskazuje na 0 */
while (*pom2 != '\0' ) *pom++ = *pom2++;
*pom = '\0';
printf("nap1==%s, nap2 == %s\n",nap1, nap2);
return nap1;
5
[ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • enzymtests.keep.pl
  •