ansic for programmers on unix systems

Upload: carlos-lopez-martinez

Post on 04-Apr-2018

218 views

Category:

Documents


0 download

TRANSCRIPT

  • 7/29/2019 ANSIC for Programmers on UNIX Systems

    1/73

    A N S I C f o r P r o g r a m m e r s

    o n U N I X S y s t e m s

    T i m L o v e

    C a m b r i d g e U n i v e r s i t y E n g i n e e r i n g D e p a r t m e n t

    t p l @ e n g . c a m . a c . u k

    O c t o b e r 9 , 1 9 9 6

    T h i s d o c u m e n t a i m s t o : -

    I n t r o d u c e C b y p r o v i d i n g a n d e x p l a i n i n g e x a m p l e s o f c o m m o n p r o g r a m m i n g

    t a s k s .

    E n a b l e t h e r e a d e r t o l e a r n f r o m a v a i l a b l e s o u r c e c o d e b y c l a r i f y i n g c o m m o n

    c a u s e s o f i n c o m p r e h e n s i o n .

    C o v e r a g e i s n o t u n i f o r m : p e d a n t r y w i l l b e s e l e c t i v e , a i m e d a t d e s c r i b i n g a s p e c t s o f

    C w h i c h a r e n o t p r e s e n t i n o t h e r l a n g u a g e s o r a r e d i e r e n t t o w h a t a p r o g r a m m e r

    f r o m a n o t h e r l a n g u a g e m i g h t e x p e c t . F o r a f u l l d e s c r i p t i o n o f C r e f e r t o o n e o f t h e

    m a n y b o o k s i n t h e b i b l i o g r a p h y .

    T h e r s t p a r t o f t h e d o c u m e n t i s a n i n f o r m a l i n t r o d u c t i o n t o C . A f t e r t h e r s t

    s e t o f e x e r c i s e s a m o r e c o m p r e h e n s i v e d e s c r i p t i o n o f s o m e f e a t u r e s i s g i v e n . A f t e r

    t h e n a l s e t o f e x e r c i s e s s e l e c t e d t o p i c s a r e c o v e r e d . N o t e t h a t t h e e x e r c i s e s a n d

    e x a m p l e s f o r m a n i n t e g r a l p a r t o f t h e c o u r s e , c o n t a i n i n g i n f o r m a t i o n n o t d u p l i c a t e d

    e l s e w h e r e . T h e c u r r e n t v e r s i o n o f t h i s d o c u m e n t i s a v a i l a b l e o n l i n e . S e e p a g e 6 4 f o r

    d e t a i l s .

    C a r o l e K l e i n a n d N i c k M c L a r e n ( C a m b r i d g e C o m p u t e r L a b ) , A n d y P i p e r , C a m p -

    b e l l M i d d l e t o n a n d J a m e s M a t h e s o n ( C U E D ) , c o n t r i b u t o r s t o c o m p . l a n g . c a n d

    v a r i o u s r e a d e r s h a v e a l l h e l p e d w i t h t h i s d o c u m e n t . A l l s u g g e s t i o n s a n d c o r r e c t i o n s

    s h o u l d g o t o T i m L o v e , C U E D ( t p l @ e n g . c a m . a c . u k ) .

    C o p y r i g h t

    c

    1 9 9 6 b y T . P . L o v e . T h i s d o c u m e n t m a y b e c o p i e d f r e e l y f o r t h e p u r -

    p o s e s o f e d u c a t i o n a n d n o n - c o m m e r c i a l r e s e a r c h . C a m b r i d g e U n i v e r s i t y E n g i n e e r i n g

    D e p a r t m e n t , C a m b r i d g e C B 2 1 P Z , E n g l a n d .

    1

  • 7/29/2019 ANSIC for Programmers on UNIX Systems

    2/73

    C O N T E N T S C O N T E N T S

    C o n t e n t s

    1 I n t r o d u c t i o n 4

    2 C o m p i l a t i o n S t a g e s 5

    3 V a r i a b l e s a n d L i t e r a l s 6

    4 A g g r e g a t e s 6

    5 C o n s t r u c t i o n s 8

    6 E x e r c i s e s 1 1 0

    7 C o n t r a c t i o n s 1 1

    8 F u n c t i o n s 1 3

    9 P o i n t e r s 1 4

    1 0 S t r i n g s 1 6

    1 1 E x e r c i s e s 2 1 9

    1 2 K e y w o r d s , O p e r a t o r s a n d D e c l a r a t i o n s 2 4

    1 2 . 1 K e y w o r d s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 4

    1 2 . 2 O p e r a t o r s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 4

    1 2 . 3 D e c l a r a t i o n s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 5

    1 3 M e m o r y A l l o c a t i o n 2 6

    1 4 I n p u t / O u t p u t 2 8

    1 4 . 1 F i l e I / O u n d e r U n i x . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 8

    1 4 . 2 I n t e r a c t i v e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1

    1 4 . 2 . 1 O u t p u t . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1

    1 4 . 2 . 2 I n p u t . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1

    1 5 S o u r c e F i l e o r g a n i s a t i o n 3 2

    1 5 . 1 P r e p r o c e s s e r F a c i l i t i e s . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2

    1 5 . 2 M u l t i p l e S o u r c e F i l e s . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3

    1 5 . 3 M a k e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 4

    1 6 D e b u g g i n g 3 5

    1 6 . 1 U t i l i t i e s a n d r o u t i n e s . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 5

    1 6 . 2 S o m e C o m m o n m i s t a k e s . . . . . . . . . . . . . . . . . . . . . . . . . 3 6

    1 6 . 2 . 1 M i s c e l l a n e o u s . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 7

    1 6 . 2 . 2 d e c l a r a t i o n m i s m a t c h . . . . . . . . . . . . . . . . . . . . . . 4 0

    1 6 . 2 . 3 m a l l o c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1

    1 6 . 2 . 4 F i n d t h e b u g . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2

    1 7 E x e r c i s e s 3 4 5

    1 8 M o r e i n f o r m a t i o n 4 8

    2

  • 7/29/2019 ANSIC for Programmers on UNIX Systems

    3/73

    L I S T O F F I G U R E S L I S T O F F I G U R E S

    A E x a m p l e s 4 9

    A . 1 C o m m a n d L i n e a r g u m e n t s . . . . . . . . . . . . . . . . . . . . . . . . 4 9

    A . 2 U s i n g q s o r t , r a n d o m n u m b e r s a n d t h e c l o c k . . . . . . . . . . . . . 4 9

    A . 3 C a l l i n g o t h e r p r o g r a m s . . . . . . . . . . . . . . . . . . . . . . . . . . 5 0

    A . 4 L i n k e d L i s t s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 0

    A . 5 U s i n g p o i n t e r s i n s t e a d o f a r r a y s . . . . . . . . . . . . . . . . . . . . . 5 2

    A . 6 A d a t a l t e r . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 3

    A . 7 R e a d i n g D i r e c t o r i e s . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 4

    A . 8 Q u e e n s : r e c u r s i o n a n d b i t a r i t h m e t i c . . . . . . . . . . . . . . . . . . 5 5

    B M o r e o n A r r a y s 5 5

    B . 1 M u l t i d i m e n s i o n a l A r r a y s . . . . . . . . . . . . . . . . . . . . . . . . . 5 5

    B . 2 r e a l l o c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 6

    C S i g n a l s a n d e r r o r h a n d l i n g 5 7

    D A N S I C 5 8

    D . 1 C o n v e r t i n g t o A N S I C . . . . . . . . . . . . . . . . . . . . . . . . . . 5 9

    E M a t h s 6 0

    E . 1 F o r t r a n a n d C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 3

    F C a l l i n g F o r t r a n f r o m C 6 4

    G U p d a t i n g t h i s d o c u m e n t 6 4

    H S a m p l e a n s w e r s t o e x e r c i s e s 6 5

    H . 1 E x e r c i s e s 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 5

    H . 2 E x e r c i s e s 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 7

    H . 3 E x e r c i s e s 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 8

    L i s t o f D e m o P r o g r a m s

    P r o g r a m P a g e D e s c r i p t i o n

    b a s i c s . c 4 b a s i c s

    s t r i n g s . c 1 6 s t r i n g s

    a r r a y . c 1 9 2 D a r r a y s

    m a l l o c i n g . c 2 7 m a l l o c

    f i l e s . c 2 9 l e i / o

    l i n e n u m s . c 3 0 l t e r

    L i s t o f F i g u r e s

    1 C o m p i l a t i o n S t a g e s . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

    2 L i n k e d L i s t . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1

    3

  • 7/29/2019 ANSIC for Programmers on UNIX Systems

    4/73

    A N S I C f o r P r o g r a m m e r s 1 . I N T R O D U C T I O N

    1 I n t r o d u c t i o n

    C ' s p o p u l a r i t y h a s i n c r e a s e d a s U n i x h a s b e c o m e m o r e w i d e s p r e a d . I t i s a e x i b l e ,

    c o n c i s e a n d s m a l l l a n g u a g e , w i t h a m i x o f l o w - l e v e l a s s e m b l e r - s t y l e c o m m a n d s a n d

    h i g h - l e v e l c o m m a n d s . I t ' s m u c h u s e d w i t h t h e X g r a p h i c s s y s t e m a n d i n c r e a s i n g l y

    f o r n u m e r i c a l a n a l y s i s . T h e r s t d e f a c t o s t a n d a r d C w a s a s d e s c r i b e d i n 7 ] a n d i s

    o f t e n k n o w n a s K & R C . T h e c u r r e n t s t a n d a r d i s A N S I C 1 2 ] i n w h i c h t h e s o u r c e

    c o n t a i n e d i n t h i s d o c u m e n t i s w r i t t e n . C h e c k y o u r l o c a l d o c u m e n t a t i o n t o s e e h o w

    t o c o m p i l e t h e c o d e . I n t h i s d o c u m e n t a t i o n c c - A a w i l l b e u s e d .

    T o t h o s e w h o h a v e p r o g r a m m e d b e f o r e , s i m p l e C p r o g r a m s s h o u l d n ' t b e t o o

    h a r d t o r e a d . S u p p o s e y o u c a l l t h i s p r o g r a m b a s i c s . c

    # i n c l u d e < s t d i o . h >

    # i n c l u d e < s t d l i b . h >

    i n t m e a n ( i n t a , i n t b )

    {

    r e t u r n ( a + b ) / 2 ;

    }

    i n t m a i n ( )

    {

    i n t i , j ;

    i n t a n s w e r ;

    / * c o m m e n t s a r e d o n e l i k e t h i s * /

    i = 7 ;

    j = 9 ;

    a n s w e r = m e a n ( i , j ) ;

    p r i n t f ( " T h e m e a n o f % d a n d % d i s % d \ n " , i , j , a n s w e r ) ;

    e x i t ( 0 ) ;

    }

    N o t e t h a t t h e s o u r c e i s f r e e - f o r m a t a n d c a s e m a t t e r s .

    A l l C p r o g r a m s n e e d a m a i n f u n c t i o n w h e r e e x e c u t i o n b e g i n s . I n t h i s e x a m p l e

    s o m e v a r i a b l e s l o c a l t o m a i n a r e c r e a t e d a n d a s s i g n e d ( u s i n g ` = ' r a t h e r t h a n ` : = '

    A l s o n o t e t h a t ` ; ' i s a s t a t e m e n t t e r m i n a t o r r a t h e r t h a n a s e p a r a t o r a s i t i s i n

    P a s c a l ) . T h e n a f u n c t i o n m e a n i s c a l l e d t h a t c a l c u l a t e s t h e m e a n o f t h e a r g u m e n t s

    g i v e n i t . T h e t y p e s o f t h e f o r m a l p a r a m e t e r s o f t h e f u n c t i o n ( i n t h i s c a s e a a n d b )

    s h o u l d b e c o m p a t i b l e w i t h t h e a c t u a l p a r a m e t e r s i n t h e c a l l . T h e i n i t i a l v a l u e s o f

    a a n d b a r e c o p i e d f r o m t h e v a r i a b l e s m e n t i o n e d i n t h e c a l l ( i a n d j )

    T h e f u n c t i o n m e a n r e t u r n s t h e a n s w e r ( a n i n t e g e r , h e n c e t h e ` i n t ' b e f o r e t h e

    f u n c t i o n n a m e ) , w h i c h i s p r i n t e d o u t u s i n g p r i n t f . T h e o n - l i n e m a n u a l p a g e d e -

    s c r i b e s p r i n t f f u l l y . F o r n o w , j u s t n o t e t h a t t h e 1 s t a r g u m e n t t o p r i n t f i s a s t r i n g

    i n w h i c h i s e m b e d d e d f o r m a t s t r i n g s ; % d f o r i n t e g e r s , % f f o r r e a l s a n d % s f o r s t r i n g s .

    T h e v a r i a b l e s t h a t t h e s e f o r m a t s t r i n g s r e f e r t o a r e a d d e d t o t h e a r g u m e n t l i s t o f

    p r i n t f . T h e ` \ n ' c h a r a c t e r c a u s e s a c a r r i a g e r e t u r n .

    C p r o g r a m s s t o p w h e n

    T h e e n d o f m a i n i s r e a c h e d .

    A n e x i t ( ) c a l l i s r e a c h e d .

    T h e p r o g r a m i s i n t e r r u p t e d i n s o m e w a y .

    T h e p r o g r a m c r a s h e s

    4

  • 7/29/2019 ANSIC for Programmers on UNIX Systems

    5/73

    A N S I C f o r P r o g r a m m e r s 2 . C O M P I L A T I O N S T A G E S

    - - - - -

    3

    F i l e

    C o m p i l e r A s s e m b l e r L o a d e r P r e p r o c e s s o r

    i n c l u d e l e s

    u s e r ' s u s e r ' s o b j e c t l e s

    i n c l u d e l e s

    s y s t e m

    s y s t e m l i b r a r i e s

    S o u r c e

    F i l e

    E x e c u t a b l e

    O b j e c t

    F i g u r e 1 : C o m p i l a t i o n S t a g e s

    T h i s p r o g r a m c a n b e c o m p i l e d u s i n g ` c c - A a - o b a s i c s b a s i c s . c ' . T h e ` - o '

    o p t i o n r e n a m e s t h e r e s u l t i n g l e b a s i c s r a t h e r t h a n t h e d e f a u l t a . o u t . R u n i t b y

    t y p i n g ` b a s i c s ' . A c o m m o n m i s t a k e t h a t b e g i n n e r s m a k e i s t o c a l l t h e i r e x e c u t a b l e

    t e s t ' . T y p i n g t e s t i s l i k e l y t o r u n t h e t e s t f a c i l i t y b u i l t i n t o t h e s h e l l , p r o d u c i n g

    n o i n p u t , r a t h e r t h a n t h e u s e r ' s p r o g r a m . T h i s c a n b e c i r c u m v e n t e d b y t y p i n g

    . / t e s t b u t o n e m i g h t j u s t a s w e l l a v o i d p r o g r a m n a m e s t h a t m i g h t b e n a m e s o f

    u n i x f a c i l i t i e s . I f y o u ' r e u s i n g t h e k s h s h e l l t h e n t y p i n g ` w h e n c e p r o g r a m n a m e ' w i l l

    t e l l y o u w h e t h e r t h e r e ' s a l r e a d y a f a c i l i t y w i t h t h a t n a m e .

    2 C o m p i l a t i o n S t a g e s

    F i r s t t h e P r e p r o c e s s o r c p p i s r u n . T h i s s t r i p s o u t c o m m e n t s a n d i n t e r p r e t s d i r e c -

    t i v e s ( l i n e s w i t h a ` # ' c h a r a c t e r i n t h e r s t c o l u m n ) . T h e ` # i n c l u d e ' d i r e c t i v e r e a d

    i n t h e n a m e d l e , l o o k i n g f o r t h e l e i n t h e d i r e c t o r y / u s r / i n c l u d e . I n c l u d e l e s

    h a v e a ` h ' s u x b y c o n v e n t i o n , a n d s h o u l d n ' t c o n t a i n e x e c u t a b l e c o d e , o n l y d e f -

    i n i t i o n s a n d d e c l a r a t i o n s . / u s r / i n c l u d e / s t d i o . h a n d / u s r / i n c l u d e / s t d l i b . h

    s h o u l d a l w a y s b e i n c l u d e d . O t h e r u s e f u l i n c l u d e l e s a r e / u s r / i n c l u d e / l i m i t s . h

    a n d / u s r / i n c l u d e / m a t h . h w h i c h d e n e c h a r a c t e r i s t i c s o f t h e m a c h i n e a n d t h e

    m a t h s i m p l e m e n t a t i o n . F u r t h e r p r e p r o c e s s o r d i r e c t i v e s t o d o w i t h m a c r o s , e t c , w i l l

    b e i n t r o d u c e d l a t e r . I f y o u w a n t t o s e e h o w t h e c o d e l o o k s a f t e r p r e - p r o c e s s i n g , t r y

    t y p i n g c c - A a - E b a s i c s . c

    A f t e r t h e p r e p r o c e s s o r c o m e s t h e c o m p i l e r , w h i c h a f t e r a p a s s o r 2 p r o d u c e s

    a s s e m b l e r c o d e . T h i s i s a s s e m b l e d t o p r o d u c e a n o b j e c t l e , i n t h i s c a s e b a s i c s . o

    F i n a l l y t h e l i n k - l o a d e r p r o d u c e s t h e e x e c u t a b l e f r o m t h e o b j e c t l e a n d a n y

    o t h e r o b j e c t y o u m e n t i o n . T h e s t a n d a r d C l i b r a r y i s a u t o m a t i c a l l y c o n s u l t e d . A n y

    o t h e r l i b r a r i e s t h a t y o u r c o d e n e e d s h a v e t o b e m e n t i o n e d o n t h e c o m p i l e l i n e . E . g .

    e n d i n g t h e l i n e w i t h ` - l m ' l i n k s i n t h e m a t h s l i b r a r y , ` - l X 1 1 ' l i n k s i n X g r a p h i c s

    f u n c t i o n s . N o t e t h a t i t ' s n o t s u c i e n t t o j u s t h a v e ` # i n c l u d e < m a t h . h > ' a t t h e

    t o p o f t h e l e i f y o u ' r e d o i n g m a t h s . T h i s j u s t s u p p l i e s e n o u g h i n f o r m a t i o n s o t h a t

    t h e c o m p i l e r c a n d o i t s w o r k c o r r e c t l y . I t d o e s n ' t t e l l t h e l i n k - l o a d e r w h e r e t h e

    m a t h s r o u t i n e s a c t u a l l y a r e . Y o u n e e d t o h a v e ` - l m ' o n t h e c o m m a n d l i n e b e f o r e

    a n e x e c u t a b l e c a n b e p r o d u c e d .

    T h e s t a g e s o f c o m p i l a t i o n c a n b e s e e n i f a ` - v ' a g i s g i v e n t o t h e c o m p i l e r .

    5

  • 7/29/2019 ANSIC for Programmers on UNIX Systems

    6/73

    A N S I C f o r P r o g r a m m e r s 3 . V A R I A B L E S A N D L I T E R A L S

    3 V a r i a b l e s a n d L i t e r a l s

    V a r i a b l e n a m e s c a n ' t b e g i n w i t h a d i g i t . N o r c a n t h e y c o n t a i n o p e r a t o r s ( l i k e ` '

    o r - ' ) . T h e y h a v e t o b e d e c l a r e d b e f o r e b e i n g u s e d . T h e a v a i l a b l e s c a l a r t y p e s a r e

    c h a r s h o r t i n t l o n g f l o a t d o u b l e a n d l o n g d o u b l e c h a r s a n d t h e v a r i o u s

    l e n g t h s o f i n t e g e r s c a n b e s i g n e d ( t h e d e f a u l t ) o r u n s i g n e d

    O f t e n y o u d o n ' t e x p l i c i t l y h a v e t o c o n v e r t t y p e s . I f y o u o p e r a t e o n v a r i a b l e s o f

    d i e r e n t t y p e s , t y p e c o n v e r s i o n t a k e s p l a c e a u o m a t i c a l l y . E . g . i f y o u a d d a n i n t

    a n d a f l o a t t h e n t h e i n t w i l l b e c o n v e r t e d t o a f l o a t a n d t h e r e s u l t w i l l b e a

    f l o a t

    u n s i g n e d i n t i ;

    f l o a t f = 3 . 1 4 ;

    i = f ;

    w i l l a u t o m a t i c a l l y s e t i t o 3 , t r u n c a t i n g t h e r e a l v a l u e . T o e x p l i c i t l y c o n v e r t t y p e s

    u s e c a s t i n g E . g .

    i = ( u n s i g n e d i n t ) f ;

    M o s t c o n v e r s i o n s p r e s e r v e t h e n u m e r i c a l v a l u e b u t o c c a s i o n a l l y t h i s i s n o t p o s s i b l e

    a n d o v e r o w o r l o s s o f p r e c i s i o n r e s u l t s . C w o n ' t w a r n y o u i f t h i s h a p p e n s .

    T h e l e n g t h o f a n i n t e g e r i s n ' t t h e s a m e o n a l l m a c h i n e s . ` s i z e o f ( i n t ) ' w i l l

    r e t u r n t h e n u m b e r o f b y t e s u s e d b y a n i n t e g e r .

    T h e s c o p e o f a v a r i a b l e i s t h e b l o c k ( t h e f u n c t i o n , o r { } p a i r ) i t ' s d e c l a r e d i n ,

    o r t h e r e m a i n d e r o f t h e l e i t ' s d e c l a r e d i n . V a r i a b l e s d e c l a r e d o u t s i d e o f a b l o c k

    a n d f u n c t i o n s c a n b e a c c e s s e d f r o m o t h e r l e s u n l e s s t h e y ' r e d e c l a r e d t o b e s t a t i c

    V a r i a b l e s d e c l a r e d i n f u n c t i o n s c a n p r e s e r v e t h e i r v a l u e b e t w e e n c a l l s i f t h e y a r e

    d e n e d a s s t a t i c , o t h e r w i s e t h e y ' r e a u t o m a t i c , g e t t i n g r e c r e a t e d f o r e a c h c a l l o f

    t h e f u n c t i o n .

    C h a r a c t e r v a l u e s c a n b e w r i t t e n i n v a r i o u s w a y s : - E . g . o n m a c h i n e s t h a t u s e

    A S C I I

    ' A ' ' \ 1 0 1 ' ' \ x 4 1 '

    a l l r e p r e s e n t 6 5 ; t h e r s t u s i n g t h e A S C I I A c h a r a c t e r , t h e s e c o n d u s i n g o c t a l a n d

    t h e t h i r d h e x a d e c i m a l . T h e n e w l i n e c h a r a c t e r i s ' \ n '

    I n t e g e r a n d r e a l v a l u e s c a n b e v a r i o u s l y e x p r e s s e d : -

    1 5 L l o n g i n t e g e r 1 5

    0 1 5 o c t a l i n t e g e r 1 5

    0 x F 7 H e x ( b a s e 1 6 ) n u m b e r F 7

    1 5 . 3 e 3 F 1 5 3 1 0

    3

    , a o a t

    1 5 . 3 e 3 1 5 3 1 0

    3

    , a d o u b l e

    1 5 . 3 e 3 L 1 5 3 1 0

    3

    , a l o n g d o u b l e

    4 A g g r e g a t e s

    V a r i a b l e s o f t h e s a m e t y p e c a n b e p u t i n t o a r r a y s .

    c h a r l e t t e r s 5 0 ] ;

    d e n e s a n a r r a y o f 5 0 c h a r a c t e r s , l e t t e r 0 ] b e i n g t h e 1 s t a n d l e t t e r 4 9 ] b e i n g

    t h e l a s t c h a r a c t e r . C h a s n o s u b s c r i p t c h e c k i n g ; i f y o u g o o t h e e n d o f a n a r r a y C

    w o n ' t w a r n y o u .

    M u l t i d i m e n s i o n a l a r r a y s c a n b e d e n e d t o o . E . g .

    c h a r v a l u e s 5 0 ] 3 0 ] 1 0 ] ;

    6

  • 7/29/2019 ANSIC for Programmers on UNIX Systems

    7/73

    A N S I C f o r P r o g r a m m e r s 4 . A G G R E G A T E S

    d e n e s a 3 D a r r a y . N o t e t h a t y o u c a n ' t a c c e s s a n e l e m e n t u s i n g v a l u e s 3 , 6 , 1 ]

    y o u h a v e t o t y p e v a l u e s 3 ] 6 ] 1 ]

    V a r i a b l e s o f d i e r e n t t y p e s c a n b e g r o u p e d i n t o a s t r u c t u r e ( l i k e a r e c o r d i n

    P a s c a l )

    s t r u c t p e r s o n {

    i n t a g e ;

    i n t h e i g h t ;

    c h a r s u r n a m e 2 0 ] ;

    } f r e d , j a n e ;

    d e n e s 2 s t r u c t u r e s o f t y p e p e r s o n e a c h o f 3 e l d s . F i e l d s a r e a c c e s s e d u s i n g t h e ` '

    o p e r a t o r . F o r e x a m p l e , f r e d . a g e i s a n i n t e g e r w h i c h c a n b e u s e d i n a s s i g n m e n t s

    u s t a s a s i m p l e v a r i a b l e c a n

    t y p e d e f c r e a t e s a n e w t y p e . E . g .

    t y p e d e f s t r u c t {

    i n t a g e ;

    i n t h e i g h t ;

    c h a r s u r n a m e 2 0 ] ;

    } p e r s o n ;

    c r e a t e a t y p e c a l l e d p e r s o n a n d

    t y p e d e f s t r u c t {

    d o u b l e r e a l ;

    d o u b l e i m a g i n a r y ;

    } c o m p l e x ;

    c r e a t e s a c o m p l e x t y p e . N o t e t h a t t y p e d e f c r e a t e s n e w v a r i a b l e t y p e s b u t d o e s n ' t

    c r e a t e a n y n e w v a r i a b l e s . T h e s e a r e c r e a t e d j u s t a s v a r i a b l e s o f t h e p r e d e n e d t y p e s

    a r e : -

    p e r s o n f r e d , j a n e ;

    S t r u c t u r e m a y b e a s s i g n e d , p a s s e d t o f u n c t i o n s a n d r e t u r n e d , b u t t h e y c a n n o t

    c o m p a r e d , s o

    p e r s o n f r e d , j a n e ;

    f r e d = j a n e ;

    i s p o s s i b l e ( t h e e l d s o f j a n e b e i n g c o p i e d i n t o f r e d ) b u t y o u c a n ' t t h e n g o o n t o

    d o

    i f ( f r e d = = j a n e )

    f p r i n t ( " T h e c o p y i n g w o r k e d o k \ n " ) ;

    y o u h a v e t o c o m p a r e e l d b y e l d .

    A s y o u s e e , n e w v a r i a b l e t y p e s a r e e a s i l y p r o d u c e d . W h a t y o u c a n ' t d o ( b u t c a n

    i n C + + a n d A l g o l 6 8 ) i s e x t e n d t h e m e a n i n g o f a n e x i s t i n g o p e r a t o r ( ` o v e r l o a d ' i t )

    s o t h a t i t w o r k s w i t h t h e n e w v a r i a b l e t y p e : y o u h a v e t o w r i t e a s p e c i c f u n c t i o n

    i n s t e a d .

    A u n i o n i s l i k e a s t r u c t e x c e p t t h a t t h e e l d s o c c u p y t h e s a m e m e m o r y l o c a t i o n

    w i t h e n o u g h m e m o r y a l l o c a t e d t o h o l d t h e l a r g e s t i t e m . T h e p r o g r a m m e r h a s t o

    k e e p a n o t e o f w h a t t h e u n i o n i s b e i n g u s e d f o r . W h a t w o u l d t h e f o l l o w i n g c o d e

    p r i n t o u t ?

    7

  • 7/29/2019 ANSIC for Programmers on UNIX Systems

    8/73

    A N S I C f o r P r o g r a m m e r s 5 . C O N S T R U C T I O N S

    u n i o n p e r s o n {

    i n t a g e ;

    i n t h e i g h t ;

    c h a r s u r n a m e 2 0 ] ;

    } f r e d ;

    f r e d . a g e = 2 3 ;

    f r e d . h e i g h t = 1 6 3 ;

    p r i n t f ( " F r e d i s % d y e a r s o l d \ n " , f r e d . a g e ) ;

    I f f r e d s t a r t e d a t m e m o r y l o c a t i o n 2 0 0 0 , t h e n f r e d . a g e f r e d . h e i g h t a n d f r e d . s u r n a m e

    w o u l d a l l b e g i n a t m e m o r y l o c a t i o n 2 0 0 0 t o o , w h e r e a s i n a s t r u c t t h e e l d s w o u l d n ' t

    o v e r l a p . S o s e t t i n g f r e d . h e i g h t t o 1 6 3 o v e r w r i t e s f r e d . a g e ( a n d t h e 1 s t 4 c h a r -

    a c t e r s o f f r e d . s u r n a m e ) m a k i n g f r e d 1 6 3 y e a r s o l d .

    5 C o n s t r u c t i o n s

    C h a s t h e f o l l o w i n g l o o p a n d s e l e c t i o n c o n s t r u c t s : -

    S e l e c t i o n

    i f ( i = = 3 ) / * c h e c k i n g f o r e q u a l i t y ; ` ! = ' t e s t s f o r i n e q u a l i t y * /

    / * n o b r a c e s n e e d e d f o r a s i n g l e s t a t e m e n t * /

    j = 4 ;

    e l s e {

    / * t h e b r a c e s a r e n e c e s s a r y i f t h e

    c l a u s e h a s m o r e t h a n o n e s t a t e m e n t

    * /

    j = 5 ;

    k = 6 ;

    }

    / * s w i t c h i s l i k e t h e c a s e s t a t e m e n t i n p a s c a l .

    T h e v a l u e s t h a t t h e s w i t c h i n g v a r i a b l e i s c o m p a r e d w i t h

    h a v e t o b e c o n s t a n t s , o r ` d e f a u l t ' .

    * /

    s w i t c h ( i ) {

    c a s e 1 : p r i n t f ( " i i s o n e \ n " ) ;

    b r e a k ; / * i f b r e a k w a s n ' t h e r e , t h i s c a s e w i l l

    f a l l t h r o u g h i n t o t h e n e x t .

    * /

    c a s e 2 : p r i n t f ( " i i s t w o \ n " ) ;

    b r e a k ;

    d e f a u l t : p r i n t f ( " i i s n e i t h e r o n e n o r t w o \ n " ) ;

    b r e a k ;

    }

    8

  • 7/29/2019 ANSIC for Programmers on UNIX Systems

    9/73

    A N S I C f o r P r o g r a m m e r s 5 . C O N S T R U C T I O N S

    L o o p s

    w h i l e ( i < 3 0 ) { / * t e s t a t t o p o f l o o p * /

    s o m e t h i n g ( ) ;

    }

    d o {

    s o m e t h i n g ( ) ;

    } w h i l e ( i < 3 0 ) ; / * t e s t a t b o t t o m o f l o o p * /

    T h e ` f o r ' c o n s t r u c t i o n i n C i s v e r y g e n e r a l . I n i t s m o s t c o m m o n f o r m i t ' s m u c h

    l i k e f o r i n o t h e r l a n g u a g e s . T h e f o l l o w i n g l o o p s t a r t s w i t h i s e t t o 0 a n d c a r r i e s o n

    w h i l e i < 5 i s t r u e , a d d i n g 1 t o i e a c h t i m e r o u n d .

    f o r ( i = 0 ; i < 5 ; i = i + 1 ) {

    s o m e t h i n g ( ) ;

    }

    T h e g e n e r a l f o r m o f ` f o r ' i s

    f o r ( e x p r e s s i o n 1 ] ; e x p r e s s i o n 2 ] ; e x p r e s s i o n 3 ] )

    s o m e t h i n g ( ) ;

    w h e r e a l l t h e e x p r e s s i o n s a r e o p t i o n a l . T h e d e f a u l t v a l u e f o r e x p r e s s i o n 2 ( t h e

    w h i l e c o n d i t i o n ) i s 1 ( t r u e ) . E s s e n t i a l l y , t h e f o r l o o p i s a w h i l e l o o p . T h e a b o v e

    f o r l o o p i s e q u i v a l e n t t o

    e x p r e s s i o n 1 ; / * i n i t i a l i s a t i o n * /

    w h i l e ( e x p r e s s i o n 2 ) { / * c o n d i t i o n * /

    s o m e t h i n g ( ) ;

    e x p r e s s i o n 3 ; / * c o d e d o n e e a c h i t e r a t i o n * /

    } ;

    E . g . t h e 2 f r a g m e n t s b e l o w a r e e q u i v a l e n t . ` i ' i s s e t t o 3 , t h e l o o p i s r u n o n c e

    f o r i = 3 a n d o n c e f o r i = 4 , t h e n i t e r a t i o n n i s h e s w h e n i = 5

    f o r ( i = 3 ; i < 5 ; i = i + 1 )

    t o t a l = t o t a l + i ;

    i = 3 ;

    w h i l e ( i < 5 ) {

    t o t a l = t o t a l + i ;

    i = i + 1 ;

    }

    W i t h i n a n y o f t h e a b o v e l o o p c o n s t r u c t i o n s , c o n t i n u e s t o p s t h e c u r r e n t i t e r a t i o n

    a n d g o e s t o t h e n e x t a n d b r e a k s t o p s t h e i t e r a t i o n s a l t o g e t h e r . E . g . i n t h e f o l l o w i n g

    f r a g m e n t 0 a n d 2 w i l l b e p r i n t e d o u t .

    i = 0 ;

    w h i l e ( i < 5 ) {

    i f ( i = = 1 ) {

    i = i + 1 ;

    9

  • 7/29/2019 ANSIC for Programmers on UNIX Systems

    10/73

    A N S I C f o r P r o g r a m m e r s 6 . E X E R C I S E S 1

    c o n t i n u e ;

    }

    i f ( i = = 3 )

    b r e a k ;

    p r i n t f ( " i = % d \ n " , i ) ;

    i = i + 1 ;

    }

    I f y o u w a n t a l o o p w h i c h o n l y e n d s w h e n b r e a k i s d o n e , y o u c a n u s e ` w h i l e ( 1 ) '

    ( b e c a u s e 1 b e i n g n o n - z e r o , c o u n t s a s b e i n g t r u e ) o r ` f o r ( ; ; ) '

    T h e { } s y m b o l s a r e u s e d t o c o m p o u n d s t a t e m e n t s . Y o u c a n d e c l a r e v a r i a b l e s

    a t t h e s t a r t o f a n y c o m p o u n d s t a t e m e n t . F o r i n s t a n c e , i f y o u ' r e w o r r i e d a b o u t t h e

    s c o p e o f a n i n d e x v a r i a b l e i n a f o r l o o p , y o u c o u l d d o t h e f o l l o w i n g .

    { i n t i ;

    f o r ( i = 1 ; i < 5 ; i + + )

    p r i n t f ( " i i s % d \ n " , i ) ;

    }

    6 E x e r c i s e s 1

    ( S a m p l e s o l u t i o n s a r e o n p a g e 6 5 )

    1 p a s c a l h a s a f u n c t i o n c a l l e d o d d , t h a t g i v e n a n i n t e g e r r e t u r n s 1 i f t h e n u m b e r

    i s o d d , 0 o t h e r w i s e . W r i t e a n o d d f u n c t i o n f o r C a n d w r i t e a m a i n r o u t i n e t o

    t e s t i t . ( h i n t { Y o u c a n u s e t h e f a c t t h a t i n C , i f i i s a n i n t e g e r t h e n ( i / 2 ) * 2

    e q u a l s i o n l y i f i i s e v e n ) .

    2 . W r i t e a r o u t i n e c a l l e d b i n a r y t h a t w h e n s u p p l i e d w i t h a d e c i m a l n u m b e r ,

    p r i n t s o u t t h a t n u m b e r i n b i n a r y , s o b i n a r y ( 1 0 ) w o u l d p r i n t o u t 1 0 1 0

    v o i d b i n a r y ( u n s i g n e d i n t n u m b e r ) {

    / * p r i n t d e c i m a l ` n u m b e r ' i n b i n a r y * /

    }

    T h e n w r i t e a m a i n r o u t i n e t o t e s t i t . D o n ' t w o r r y a b o u t l e a d i n g z e r o e s t o o

    m u c h a t t h e m o m e n t . N o t e t h a t b i n a r y r e t u r n s a v o i d , i . e . n o t h i n g .

    3 . W r i t e a r o u t i n e c a l l e d b a s e t h a t w h e n s u p p l i e d w i t h a d e c i m a l n u m b e r a n d a

    b a s e , p r i n t s o u t t h a t n u m b e r t o t h e r e q u i r e d b a s e , s o b a s e ( 1 0 , 3 ) w o u l d p r i n t

    o u t 1 0 1

    v o i d b a s e ( u n s i g n e d i n t n u m b e r , u n s i g n e d i n t b a s e ) {

    / * p r i n t d e c i m a l ` n u m b e r ' t o t h e g i v e n ` b a s e ' * /

    }

    T h e n w r i t e a m a i n r o u t i n e t o t e s t i t .

    4 . P r i n t a t a b l e o f a l l t h e p r i m e s l e s s t h a n 1 0 0 0 . U s e a n y m e t h o d y o u w a n t . T h e

    s i e v e m e t h o d i s d e s c r i b e d h e r e : - a i m t o c r e a t e a n a r r a y ` n u m b e r ' s u c h t h a t

    i f n u m b e r s i ] = = P R I M E t h e n i i s a p r i m e n u m b e r . F i r s t m a r k t h e m a l l a s

    b e i n g p r i m e . T h e n r e p e a t e d l y p i c k t h e s m a l l e s t p r i m e y o u h a v e n ' t d e a l t w i t h

    a n d m a r k a l l i t s m u l t i p l e s a s b e i n g n o n p r i m e . P r i n t o u t t h e p r i m e s a t t h e

    e n d . H e r e ' s a s k e l e t o n : -

    1 0

  • 7/29/2019 ANSIC for Programmers on UNIX Systems

    11/73

    A N S I C f o r P r o g r a m m e r s 7 . C O N T R A C T I O N S

    # i n c l u d e < s t d i o . h >

    # i n c l u d e < s t d l i b . h >

    # d e f i n e P R I M E 1 / * C r e a t e a l i a s e s f o r 0 a n d 1 * /

    # d e f i n e N O N P R I M E 0

    i n t n u m b e r s 1 0 0 0 ] ;

    v o i d m a r k _ m u l t i p l e s ( i n t n u m ) {

    / * T O D O : S e t a l l e l e m e n t s w h i c h r e p r e s e n t m u l t i p l e s o f n u m t o N O N P R I M E . * /

    }

    i n t g e t _ n e x t _ p r i m e ( i n t n u m ) {

    / * f i n d t h e n e x t p r i m e n u m b e r a f t e r ` n u m ' * /

    i n t a n s w e r ;

    a n s w e r = n u m + 1 ;

    w h i l e ( n u m b e r s a n s w e r ] = = N O N P R I M E ) {

    a n s w e r = a n s w e r + 1 ;

    i f ( a n s w e r = = 1 0 0 0 )

    b r e a k ;

    }

    r e t u r n a n s w e r ;

    }

    m a i n ( ) {

    i n t i ;

    i n t n e x t _ p r i m e ;

    / * T O D O : S e t a l l t h e e l e m e n t s t o P R I M E . R e m e m b e r , t h e 1 s t e l e m e n t i s

    n u m b e r s 0 ] a n d t h e l a s t i s n u m b e r s 9 9 9 ] * /

    / * T O D O : 0 a n d 1 a r e n ' t p r i m e , s o s e t n u m b e r s 0 ] a n d n u m b e r s 1 ]

    t o N O N P R I M E * /

    n e x t _ p r i m e = 2 ;

    d o {

    m a r k _ m u l t i p l e s ( n e x t _ p r i m e ) ;

    n e x t _ p r i m e = g e t _ n e x t _ p r i m e ( n e x t _ p r i m e ) ;

    } w h i l e ( n e x t _ p r i m e < 1 0 0 0 ) ;

    / * T O D O : P r i n t o u t t h e i n d i c e s o f e l e m e n t s w h i c h a r e s t i l l s e t t o P R I M E * /

    e x i t ( 0 ) ;

    }

    T h e ` T O D O ' l i n e s d e s c r i b e w h a t c o d e y o u n e e d t o a d d i n .

    Y o u c a n s p e e d u p t h i s p r o g r a m c o n s i d e r a b l y b y r e p l a c i n g 1 0 0 0 w h e r e a p p r o -

    p r i a t e b y s o m e t h i n g s m a l l e r . S e e p a g e 4 5 f o r d e t a i l s .

    7 C o n t r a c t i o n s

    C v e t e r a n s u s e a b b r e v i a t e d f o r m s f o r e x p r e s s i o n s . S o m e a r e n a t u r a l a n d w i d e l y

    a d o p t e d , o t h e r s m e r e l y l e a d t o o b s c u r i t y { e v e n i f t h e y p r o d u c e f a s t e r c o d e ( a n d

    1 1

  • 7/29/2019 ANSIC for Programmers on UNIX Systems

    12/73

    A N S I C f o r P r o g r a m m e r s 7 . C O N T R A C T I O N S

    o f t e n t h e y d o n ' t ) t h e y w a s t e f u t u r e p r o g r a m m e r s ' t i m e .

    i + + i s e q u i v a l e n t t o i = i + 1 . T h i s ( a n d t h e i - - d e c r e m e n t i n g o p e r a t o r ) i s a

    c o m m o n c o n t r a c t i o n . T h e o p e r a t i o n c a n b e d o n e a f t e r t h e v a r i a b l e i s u s e d , o r

    ( b y u s i n g - - i + + i ) b e f o r e , s o

    i = 4 ;

    p r i n t f ( " i = % d \ n " , i + + )

    a n d

    i = 4 ;

    p r i n t f ( " i = % d \ n " , + + i )

    w i l l b o t h l e a v e i a s 5 , b u t i n t h e 1 s t f r a g m e n t 4 w i l l b e p r i n t e d o u t w h i l e i n

    t h e 2 n d 5 w i l l .

    i + = 6 i s e q u i v a l e n t t o i = i + 6 . T h i s s t y l e o f c o n t r a c t i o n i s n ' t s o c o m m o n , b u t

    c a n b e u s e d w i t h m o s t o f t h e b i n a r y o p e r a t o r s .

    A s s i g n m e n t s t a t e m e n t s h a v e a v a l u e { t h e n a l v a l u e o f t h e l e f t - h a n d - s i d e {

    s o j = ( i = 3 + 4 ) w i l l s e t i t h e n j t o 7 , a n d i = j = k = 0 w i l l s e t k , t h e n j

    t h e n i t o z e r o . T h i s f e a t u r e s h o u l d b e u s e d w i t h c a u t i o n .

    T h e ` ' o p e r a t o r i s u s e d b e t w e e n 2 e x p r e s s i o n s i f t h e v a l u e o f t h e 1 s t e x p r e s s i o n

    c a n b e i g n o r e d . I t ' s a w a y t o p u t 2 o r m o r e s t a t e m e n t s w h e r e n o r m a l l y o n l y

    o n e w o u l d g o . E . g .

    f o r ( i n i t ( 3 ) , i = 0 , j + 0 ; i < 1 0 0 ; i + + , j + + )

    T h i s f e a t u r e i s o f t e n o v e r - u s e d t o o .

    E x p r e s s i o n s w i t h c o m p a r i s o n o p e r a t o r s r e t u r n 1 i f t h e c o m p a r i s o n i s t r u e , 0

    i f f a l s e , s o w h i l e ( i ! = 0 ) a n d w h i l e ( i ) a r e e q u i v a l e n t .

    T h e ` i f ( c o n d ) e x p 1 ; e l s e e x p 2 ; ' c o n s t r u c t i o n c a n b e a b b r e v i a t e d u s i n g

    ( c o n d ) ? e x p 1 : e x p 2 ' . T h e f o l l o w i n g f r a g m e n t s a r e e q u i v a l e n t .

    i f ( a = = 6 )

    j = 7 ;

    e l s e

    j = 5 ;

    ( a = = 6 ) ? j = 7 : j = 5 ;

    T h i s n o t a t i o n s h o u l d b e u s e d w i t h d i s c r e t i o n .

    1 2

  • 7/29/2019 ANSIC for Programmers on UNIX Systems

    13/73

    A N S I C f o r P r o g r a m m e r s 8 . F U N C T I O N S

    8 F u n c t i o n s

    C h a s n o p r o c e d u r e s , o n l y f u n c t i o n s . T h e i r d e n i t i o n s c a n ' t b e n e s t e d b u t a l l e x c e p t

    m a i n c a n b e c a l l e d r e c u r s i v e l y . I n A N S I C t h e f o r m o f a f u n c t i o n d e n i t i o n i s

    ( )

    f

    g

    E . g .

    i n t m e a n ( i n t x , i n t y )

    {

    i n t t m p ;

    t m p = ( x + y ) / 2 ;

    r e t u r n t m p ;

    }

    I n K & R C t h e s a m e f u n c t i o n w o u l d b e w r i t t e n a s

    i n t m e a n ( x , y )

    i n t x ;

    i n t y ;

    {

    i n t t m p ;

    t m p = ( x + y ) / 2 ;

    r e t u r n t m p ;

    }

    N o t e t h a t t h e f o r m a l a r g u m e n t d e c l a r a t i o n s a r e d i e r e n t l y p l a c e d . T h i s a r e

    t h e m o s t v i s i b l e d i e r e n c e b e t w e e n A N S I C a n d K & R C . P r o g r a m s ( u s u a l l y c a l l e d

    p r o t o i z e o r p r o t o g e n ) e x i s t t o c o n v e r t t o A N S I C s t y l e a r g u m e n t d e c l a r a t i o n s .

    T h e d e f a u l t f u n c t i o n t y p e i s ` e x t e r n i n t ' a n d t h e d e f a u l t t y p e f o r t h e f o r m a l

    a r g u m e n t s i s ` i n t ' b u t d e p e n d i n g o n t h e s e d e f a u l t s i s a s k i n g f o r t r o u b l e ; t h e y s h o u l d

    b e e x p l i c i t l y d e c l a r e d .

    F u n c t i o n s e n d w h e n

    e x e c u t i o n r e a c h e s t h e c l o s i n g ` g ' o f t h e f u n c t i o n . I f t h e f u n c t i o n i s s u p p o s e d

    t o r e t u r n s o m e t h i n g , t h e r e t u r n v a l u e w i l l b e u n d e n e d .

    a r e t u r n ' s t a t e m e n t i s r e a c h e d , r e t u r n i n g c o n t r o l t o t h e c a l l i n g f u n c t i o n .

    a n e x i t ' s t a t e m e n t i s r e a c h e d , e n d i n g e x e c u t i o n o f t h e w h o l e p r o g r a m .

    J u s t a s r e t u r n c a n r e t u r n a v a l u e t o t h e c a l l i n g r o u t i n e , s o e x i t r e t u r n s a v a l u e

    t o t h e U n i x e n v i r o n m e n t . B y c o n v e n t i o n , r e t u r n i n g a z e r o m e a n s t h a t t h e p r o g r a m

    h a s r u n s u c c e s s f u l l y . B e t t e r s t i l l , r e t u r n E X I T _ S U C C E S S o r E X I T _ F A I L U R E ; t h e y ' r e

    d e n e d i n s t d l i b . h

    A l l p a r a m e t e r s i n C a r e ` p a s s e d b y v a l u e ' . T o p e r f o r m t h e e q u i v a l e n t o f P a s c a l ' s

    ` p a s s b y r e f e r e n c e ' y o u n e e d t o k n o w a b o u t p o i n t e r s .

    1 3

  • 7/29/2019 ANSIC for Programmers on UNIX Systems

    14/73

    A N S I C f o r P r o g r a m m e r s 9 . P O I N T E R S

    9 P o i n t e r s

    E v e n i f y o u d o n ' t u s e p o i n t e r s y o u r s e l f , t h e c o d e y o u ' l l l e a r n f r o m w i l l h a v e t h e m .

    S u p p o s e i i s a n i n t e g e r . T o n d t h e a d d r e s s o f i t h e & o p e r a t o r i s u s e d ( & i )

    S e t t i n g a p o i n t e r t o t h i s v a l u e l e t s y o u r e f e r i n d i r e c t l y t o t h e v a r i a b l e i . I f y o u

    h a v e t h e a d d r e s s o f a p o i n t e r v a r i a b l e a n d w a n t t o n d t h e v a r i a b l e ' s v a l u e , t h e n

    t h e d e r e f e r e n c i n g o p e r a t o r * i s u s e d .

    i n t i ;

    / * T h e n e x t s t a t e m e n t d e c l a r e s i _ p t r t o b e a p o i n t e r a t

    a n i n t e g e r . T h e d e c l a r a t i o n s a y s t h a t i f i _ p t r i s

    d e r e f e r e n c e d , o n e g e t s a n i n t .

    * /

    i n t * i _ p t r ;

    i _ p t r = & i ; / * i n i t i a l i s e i _ p t r t o p o i n t t o i * /

    / * T h e f o l l o w i n g 2 l i n e s e a c h s e t i t o 5 * /

    i = 5 ;

    * i p t r = 5 ; / * i . e . s e t t o 5 t h e i n t t h a t i p t r p o i n t s t o * /

    P o i n t e r s a r e n ' t j u s t m e m o r y a d d r e s s e s ; t h e y h a v e t y p e s . A p o i n t e r - t o - a n - i n t i s i n t *

    a n d i s o f a d i e r e n t t y p e t o a p o i n t e r - t o - a - c h a r ( w h i c h i s c h a r * ) . T h e d i e r e n c e

    m a t t e r s e s p e c i a l l y w h e n t h e p o i n t e r i s b e i n g i n c r e m e n t e d ; t h e v a l u e o f t h e p o i n t e r

    i s i n c r e a s e d b y t h e s i z e o f t h e o b j e c t i t p o i n t s t o . S o i f w e a d d e d

    i p t r = i p t r + 1 ;

    i n t h e a b o v e e x a m p l e , t h e n i p t r w o u l d n ' t b e i n c r e m e n t e d b y 1 ( w h i c h w o u l d m a k e

    i t p o i n t s o m e w h e r e i n t h e m i d d l e o f i ) b u t b y t h e l e n g t h o f a n i n t , s o t h a t i t w o u l d

    p o i n t t o t h e m e m o r y l o c a t i o n j u s t b e y o n d i . T h i s i s u s e f u l i f i i s p a r t o f a n a r r a y .

    I n t h e f o l l o w i n g f r a g m e n t , t h e p o i n t e r s t e p s t h r o u g h a n a r r a y .

    i n t n u m b e r s 1 0 ] ;

    i n t * i p t r ;

    i n t i ;

    n u m b e r s 0 ] = 1 ;

    n u m b e r s 1 ] = 2 ;

    n u m b e r s 2 ] = 3 ;

    i p t r = & n u m b e r s 0 ] ; / * P o i n t i p t r t o t h e f i r s t e l e m e n t i n n u m b e r s ] * /

    / * n o w i n c r e m e n t i p t r t o p o i n t t o s u c c e s s i v e e l e m e n t s * /

    f o r ( i = 0 ; i < 3 ; i + + ) {

    p r i n t f ( " * i p t r i s % d \ n " , * i p t r ) ;

    i p t r = i p t r + 1 ;

    }

    P o i n t e r s a r e e s p e c i a l l y u s e f u l w h e n f u n c t i o n s o p e r a t e o n s t r u c t u r e s . U s i n g a

    p o i n t e r a v o i d s c o p i e s o f p o t e n t i a l l y b i g s t r u c t u r e s b e i n g m a d e .

    t y p e d e f s t r u c t {

    i n t a g e ;

    1 4

  • 7/29/2019 ANSIC for Programmers on UNIX Systems

    15/73

    A N S I C f o r P r o g r a m m e r s 9 . P O I N T E R S

    i n t h e i g h t ;

    c h a r s u r n a m e 2 0 ] ;

    } p e r s o n ;

    p e r s o n f r e d , j a n e ;

    i n t s u m _ o f _ a g e s ( p e r s o n * p e r s o n 1 , p e r s o n * p e r s o n 2 ) {

    i n t s u m ; / * a v a r i a b l e l o c a l t o t h i s f u n c t i o n . * /

    / * D e r e f e r e n c e t h e p o i n t e r s , t h e n u s e t h e ` . ' o p e r a t o r t o g e t t h e

    f i e l d s * /

    s u m = ( * p e r s o n 1 ) . a g e + ( * p e r s o n 2 ) . a g e ;

    r e t u r n s u m ;

    }

    O p e r a t i o n s l i k e ( * p e r s o n 1 ) . a g e a r e s o c o m m o n t h a t t h e r e ' s a s p e c i a l , m o r e n a t u r a l

    n o t a t i o n f o r i t : p e r s o n 1 - > a g e

    T o f u r t h e r i l l u s t r a t e t h e u s e o f p o i n t e r s l e t ' s s u p p o s e t h a t i n t h e r s t e x a m p l e

    o n p a g e 4 w e w a n t e d t o p a s s t o t h e f u n c t i o n m e a n t h e v a r i a b l e w h e r e w e w a n t e d

    t h e a n s w e r s t o r e d . S i n c e w e n o l o n g e r n e e d m e a n t o r e t u r n a v a l u e , w e c a n m a k e i t

    r e t u r n v o i d . L e t ' s r s t t r y : -

    # i n c l u d e < s t d i o . h >

    # i n c l u d e < s t d l i b . h >

    v o i d m e a n ( i n t a , i n t b , i n t r e t u r n _ v a l )

    {

    r e t u r n _ v a l = ( a + b ) / 2 ;

    p r i n t f ( " r e t u r n _ v a l i n m e a n i n % d \ n " , r e t u r n _ v a l ) ;

    }

    m a i n ( )

    {

    i n t i , j ;

    i n t a n s w e r ;

    i = 7 ;

    j = 9 ;

    m e a n ( i , j , a n s w e r ) ;

    p r i n t f ( " T h e m e a n o f % d a n d % d i s % d \ n " , i , j , a n s w e r ) ;

    }

    T h i s w o n ' t w o r k . A l t h o u g h r e t u r n v a l i s s e t t o t h e r i g h t v a l u e i n m e a n a n s w e r

    i s n ' t . R e m e m b e r , r e t u r n v a l a n d a n s w e r a r e s e p a r a t e v a r i a b l e s . T h e v a l u e o f

    a n s w e r i s c o p i e d i n t o r e t u r n v a l w h e n m e a n i s c a l l e d . T h e m e a n f u n c t i o n d o e s n ' t

    k n o w w h e r e a n s w e r i s s t o r e d , s o i t c a n ' t c h a n g e i t . A p o i n t e r t o a n s w e r h a s t o b e

    g i v e n t o m e a n ( )

    # i n c l u d e < s t d i o . h >

    # i n c l u d e < s t d l i b . h >

    / * N o t e t h e f o r m o f t h e p t r _ t o _ a n s w e r d e c l a r a t i o n b e l o w . I t

    s a y s t h a t i f y o u d e r e f e r e n c e p t r _ t o _ a n s w e r y o u g e t a n

    i n t . i . e . p t r _ t o _ a n s w e r i s a p o i n t e r t o a n i n t .

    * /

    1 5

  • 7/29/2019 ANSIC for Programmers on UNIX Systems

    16/73

    A N S I C f o r P r o g r a m m e r s 1 0 . S T R I N G S

    v o i d m e a n ( i n t a , i n t b , i n t * p t r _ t o _ a n s w e r )

    {

    * p t r _ t o _ a n s w e r = ( a + b ) / 2 ;

    }

    m a i n ( )

    {

    i n t i , j ;

    i n t a n s w e r ;

    i = 7 ;

    j = 9 ;

    m e a n ( i , j , & a n s w e r ) ; / * N o t e t h a t n o w w e ' r e p a s s i n g a p o i n t e r

    * t o ' a n s w e r '

    * /

    p r i n t f ( " T h e m e a n o f % d a n d % d i s % d \ n " , i , j , a n s w e r ) ;

    }

    T h e r e ' s a s p e c i a l v a l u e f o r n u l l p o i n t e r s ( N U L L ) a n d a s p e c i a l t y p e f o r g e n e r i c

    p o i n t e r s ( v o i d * ) . I n K & R C , c a s t i n g a p o i n t e r f r o m o n e t y p e t o a n o t h e r d i d n ' t

    c h a n g e i t s v a l u e . I n A N S I C h o w e v e r , a l i g n m e n t i s t a k e n i n t o a c c o u n t . I f a l o n g

    c a n o n l y b e g i n a t a n e v e n m e m o r y l o c a t i o n , t h e n a p o i n t e r o f t y p e c h a r * p o i n t i n g

    t o a n o d d l o c a t i o n w i l l h a v e i t s v a l u e c h a n g e d i f c a s t i n t o a l o n g *

    1 0 S t r i n g s

    I n C a s t r i n g i s j u s t a n a r r a y o f c h a r a c t e r s . T h e e n d o f t h e s t r i n g i s d e n o t e d b y a z e r o

    b y t e . T h e v a r i o u s s t r i n g m a n i p u l a t i o n f u n c t i o n s a r e d e s c r i b e d i n t h e o n l i n e m a n u a l

    p a g e c a l l e d ` s t r i n g ' , a n d d e c l a r e d i n t h e s t r i n g . h i n c l u d e l e . T h e f o l l o w i n g p i e c e

    o f c o d e i l l u s t r a t e s t h e i r u s e a n d h i g h l i g h t s s o m e p r o b l e m s

    / * s t r i n g s . c * /

    # i n c l u d e < s t d i o . h >

    # i n c l u d e < s t r i n g . h >

    c h a r s t r 1 1 0 ] ; / * T h i s r e s e r v e s s p a c e f o r 1 0 c h a r a c t e r s * /

    c h a r s t r 2 1 0 ] ;

    c h a r s t r 3 ] = " i n i t i a l t e x t " ; / * s t r 3 i s s e t t o t h e r i g h t s i z e f o r y o u

    * a n d a u t o m a t i c a l l y t e r m i n a t e d w i t h a 0

    * b y t e . Y o u c a n o n l y i n i t i a l i s e

    * s t r i n g s t h i s w a y w h e n d e f i n i n g .

    * /

    c h a r * c _ p t r ; / * d e c l a r e s a p o i n t e r , b u t d o e s n ' t i n i t i a l i s e i t . * /

    u n s i g n e d i n t l e n ;

    m a i n ( )

    {

    / * c o p y " h e l l o " i n t o s t r 1 . I f s t r 1 i s n ' t b i g e n o u g h , h a r d l u c k * /

    s t r c p y ( s t r 1 , " h e l l o " ) ;

    / * i f y o u l o o k e d a t m e m o r y l o c a t i o n s t r 1 y o u ' d s e e t h e s e b y t e

    v a l u e s : ' h ' , ' e ' , ' l ' , ' l ' , ' o ' , ' \ 0 '

    * /

    1 6

  • 7/29/2019 ANSIC for Programmers on UNIX Systems

    17/73

    A N S I C f o r P r o g r a m m e r s 1 0 . S T R I N G S

    / * c o n c a t e n a t e " s i r " o n t o s t r 1 . I f s t r 1 i s t o o s m a l l , h a r d l u c k * /

    s t r c a t ( s t r 1 , " s i r " ) ;

    / * v a l u e s a t s t r 1 : ' h ' , ' e ' , ' l ' , ' l ' , ' o ' , ' ' , ' s ' , ' i ' , ' r ' , ' \ 0 '

    * /

    l e n = s t r l e n ( s t r 1 ) ; / * f i n d t h e n u m b e r o f c h a r a c t e r s * /

    p r i n t f ( " L e n g t h o f < % s > i s % d c h a r a c t e r s \ n " , s t r 1 , l e n ) ;

    i f ( s t r c m p ( s t r 1 , s t r 3 ) )

    p r i n t f ( " < % s > a n d < % s > a r e d i f f e r e n t \ n " , s t r 1 , s t r 3 ) ;

    e l s e

    p r i n t f ( " < % s > a n d < % s > a r e t h e s a m e \ n " , s t r 1 , s t r 3 ) ;

    i f ( s t r s t r ( s t r 1 , " b o y " ) = = ( c h a r * ) N U L L )

    p r i n t f ( " T h e s t r i n g < b o y > i s n ' t i n < % s > \ n " , s t r 1 ) ;

    e l s e

    p r i n t f ( " T h e s t r i n g < b o y > i s i n < % s > \ n " , s t r 1 ) ;

    / * f i n d t h e f i r s t ` o ' i n s t r 1 * /

    c _ p t r = s t r c h r ( s t r 1 , ' o ' ) ;

    i f ( c _ p t r = = ( c h a r * ) N U L L )

    p r i n t f ( " T h e r e i s n o o i n < % s > \ n " , s t r 1 ) ;

    e l s e {

    p r i n t f ( " < % s > i s f r o m t h e f i r s t o i n < % s > t o t h e e n d . \ n " ,

    c _ p t r , s t r 1 ) ;

    / * N o w c o p y t h i s p a r t o f s t r 1 i n t o s t r 2 * /

    s t r c p y ( s t r 2 , c _ p t r ) ;

    }

    }

    U s u a l l y ` s t r 1 ' w o u l d b e u s e d i n s t e a d o f ` & s t r 1 0 ] ' t o r e f e r t o t h e a d d r e s s o f t h e

    r s t e l e m e n t o f t h e c h a r a c t e r a r r a y , s i n c e C d e n e s t h e v a l u e o f a n a r r a y n a m e t o

    b e t h e l o c a t i o n o f t h e r s t e l e m e n t . I n f a c t , o n c e y o u ' v e s e t c p t r t o s t r , t h e 2

    v a r i a b l e s b e h a v e s i m i l a r l y i n m o s t c i r c u m s t a n c e s .

    T h e r e i s n o t r e a l l y a n y d i e r e n c e i n t h e b e h a v i o u r o f t h e a r r a y s u b s c r i p t i n g

    o p e r a t o r ] a s i t a p p l i e s t o a r r a y s a n d p o i n t e r s . T h e e x p r e s s i o n s s t r i ] a n d

    c _ p t r i ] a r e b o t h p r o c e s s e d i n t e r n a l l y u s i n g p o i n t e r s . F o r i n s t a n c e , s t r i ]

    i s e q u i v a l e n t t o * ( ( s t r ) + ( i ) )

    A r r a y a n d p o i n t e r d e c l a r a t i o n s a r e i n t e r c h a n g e a b l e a s f u n c t i o n f o r m a l p a r a m -

    e t e r s . S i n c e a r r a y s d e c a y i m m e d i a t e l y i n t o p o i n t e r s , a n a r r a y i s n e v e r a c t u a l l y

    p a s s e d t o a f u n c t i o n . T h e r e f o r e , a n y p a r a m e t e r d e c l a r a t i o n s w h i c h ` l o o k l i k e '

    a r r a y s , e . g .

    i n t f ( c h a r a ] )

    {

    }

    a r e t r e a t e d b y t h e c o m p i l e r a s i f t h e y w e r e p o i n t e r s , s o ` c h a r a ] ' c o u l d b e

    r e p l a c e d b y ` c h a r * a ' . T h i s c o n v e r s i o n h o l d s o n l y w i t h i n f u n c t i o n f o r m a l

    p a r a m e t e r d e c l a r a t i o n s , n o w h e r e e l s e . I f t h i s c o n v e r s i o n b o t h e r s y o u , a v o i d i t .

    1 7

  • 7/29/2019 ANSIC for Programmers on UNIX Systems

    18/73

    A N S I C f o r P r o g r a m m e r s 1 0 . S T R I N G S

    B e c a u s e t h e d i s t i n c t i o n b e t w e e n p o i n t e r s a n d a r r a y s o f t e n d o e s n ' t s e e m t o m a t -

    t e r , p r o g r a m m e r s g e t s u r p r i s e d w h e n i t d o e s . A r r a y s a r e n o t p o i n t e r s . T h e a r r a y

    d e c l a r a t i o n ` c h a r s t r 1 1 0 ] ; ' r e q u e s t s t h a t s p a c e f o r t e n c h a r a c t e r s b e s e t a s i d e .

    T h e p o i n t e r d e c l a r a t i o n ` c h a r * c _ p t r ; ' o n t h e o t h e r h a n d , r e q u e s t s a p l a c e w h i c h

    h o l d s a p o i n t e r . T h e p o i n t e r i s t o b e k n o w n b y t h e n a m e c _ p t r , a n d c a n p o i n t

    t o a n y c h a r ( o r c o n t i g u o u s a r r a y o f c h a r s ) a n y w h e r e . s t r 1 c a n ' t b e c h a n g e d : i t ' s

    w h e r e t h e a r r a y b e g i n s a n d w h e r e i t w i l l a l w a y s s t a y .

    Y o u c a n ' t p a s s w h o l e a r r a y s t o f u n c t i o n s , o n l y p o i n t e r s t o t h e m . T o d e c l a r e s u c h

    p o i n t e r s c o r r e c t l y y o u n e e d t o b e a w a r e o f t h e d i e r e n t w a y s t h a t m u l t i - d i m e n s i o n a l

    a r r a y s c a n b e s t o r e d i n m e m o r y . S u p p o s e y o u c r e a t e d a 2 D a r r a y o f c h a r a c t e r s a s

    f o l l o w s : -

    c h a r f r u i t s 3 ] 1 0 ] = { " a p p l e " , " b a n a n a " , " o r a n g e " } ;

    T h i s c r e a t e s s p a c e f o r 3 s t r i n g s e a c h 1 0 b y t e s l o n g . L e t ' s s a y t h a t ` f r u i t s ' g e t s

    s t o r e d a t m e m o r y l o c a t i o n 6 0 0 0 . T h e n t h i s w i l l b e t h e l a y o u t i n m e m o r y :

    6 0 0 0 a p p l e \ 0 . . . .

    6 0 1 0 b a n a n a \ 0 . . .

    6 0 2 0 o r a n g e \ 0 . . .

    I f y o u w a n t e d t o w r i t e a f u n c t i o n t h a t p r i n t e d t h e s e s t r i n g s o u t s o y o u c o u l d d o

    l i s t n a m e s ( f r u i t s ) ' , t h e f o l l o w i n g r o u t i n e w i l l w o r k

    v o i d l i s t _ n a m e s ( c h a r n a m e s ] 1 0 ] ) {

    i n t i ;

    f o r ( i = 0 ; i < 3 ; i + + ) {

    p r i n t f ( " % s \ n " , n a m e s i ] ) ;

    }

    }

    T h e r o u t i n e h a s t o b e t o l d t h e s i z e o f t h e t h i n g s t h a t n a m e s p o i n t s t o , o t h e r w i s e i t

    w o n ' t b e a b l e t o c a l c u l a t e n a m e s i ] c o r r e c t l y . S o t h e ` 1 0 ' n e e d s t o b e p r o v i d e d i n

    t h e d e c l a r a t i o n . I t d o e s n ' t c a r e a b o u t h o w m a n y t h i n g s a r e i n t h e a r r a y , s o t h e r s t

    p a i r o f b r a c k e t s m i g h t j u s t a s w e l l b e e m p t y . A n e q u i v a l e n t d e c l a r a t i o n i s

    v o i d l i s t _ n a m e s ( c h a r ( * n a m e s ) 1 0 ] )

    s a y i n g t h a t ` n a m e s ' i s a p o i n t e r t o a n a r r a y e a c h o f w h o s e e l e m e n t s i s 1 0 c h a r s .

    T h e a b o v e m e t h o d o f c r e a t i n g a r r a y s w a s t e s a l o t o f s p a c e i f t h e s t r i n g s d i e r

    g r e a t l y i n l e n g t h . A n a l t e r n a t i v e w a y t o i n i t i a l i s e i s a s f o l l o w s : -

    c h a r * v e g ] = { " a r t i c h o k e " , " b e e t r o o t " , " c a r r o t " } ;

    H e r e ` v e g ' i s s e t u p a s a n a r r a y o f p o i n t e r - t o - c h a r s . T h e l a y o u t i n m e m o r y i s

    d i e r e n t t o o . A p o s s i b l e l a y o u t i s : -

    A d d r e s s V a l u e

    6 0 0 0 9 0 0 0

    6 0 0 4 9 6 0 0

    6 0 0 8 9 7 0 0

    9 0 0 0 a r t i c h o k e \ 0

    9 6 0 0 b e e t r o o t \ 0

    9 7 0 0 c a r r o t \ 0

    1 8

  • 7/29/2019 ANSIC for Programmers on UNIX Systems

    19/73

    A N S I C f o r P r o g r a m m e r s 1 1 . E X E R C I S E S 2

    N o t e t h a t ` v e g ' i s t h e s t a r t o f a n a r r a y o f p o i n t e r s . T h e a c t u a l c h a r a c t e r s a r e

    s t o r e d e l s e w h e r e . I f w e w a n t e d a f u n c t i o n t h a t w o u l d p r i n t o u t t h e s e s t r i n g s ,

    t h e n t h e ` l i s t n a m e s ( ) ' r o u t i n e a b o v e w o u l d n ' t d o , s i n c e t h i s t i m e t h e a r g u m e n t

    n a m e s ' w o u l d n ' t b e p o i n t i n g t o t h i n g s t h a t a r e 1 0 b y t e s l o n g , b u t 4 ( t h e s i z e o f a

    p o i n t e r - t o - c h a r ) . T h e d e c l a r a t i o n n e e d s t o s a y t h a t ` n a m e s ' p o i n t s t o a c h a r a c t e r

    p o i n t e r .

    v o i d l i s t _ n a m e s ( c h a r * * n a m e s ) {

    i n t i ;

    f o r ( i = 0 ; i < 3 ; i + + ) {

    p r i n t f ( " % s \ n " , n a m e s i ] ) ;

    }

    }

    T h e f o l l o w i n g d e c l a r a t i o n w o u l d a l s o w o r k : -

    v o i d l i s t _ n a m e s ( c h a r * n a m e s ] ) {

    U s i n g c d e c l ( s e e p a g e 3 6 ) w i l l h e l p c l a r i f y t h e a b o v e d e c l a r a t i o n s .

    T h e p r o g r a m b e l o w s h o w s t h e 2 t y p e s o f a r r a y i n a c t i o n . T h e f u n c t i o n s t o p r i n t

    t h e n a m e s o u t a r e l i k e t h e a b o v e e x c e p t t h a t

    T h e a r r a y s a r e e n d s t o p p e d s o t h a t t h e f u n c t i o n s n e e d n ' t k n o w b e f o r e h a n d

    h o w m a n y e l e m e n t s a r e i n t h e a r r a y s .

    T h e f o r l o o p u s e s s o m e c o m m o n c o n t r a c t i o n s .

    # i n c l u d e < s t d i o . h >

    # i n c l u d e < s t d l i b . h >

    v o i d l i s t _ n a m e s ( c h a r ( * n a m e s ) 1 0 ] ) {

    f o r ( ; n a m e s 0 ] 0 ] ; n a m e s + + ) {

    p r i n t f ( " % s \ n " , * n a m e s ) ;

    }

    }

    v o i d l i s t _ n a m e s 2 ( c h a r * n a m e s ] ) {

    f o r ( ; * n a m e s ! = N U L L ; n a m e s + + ) {

    p r i n t f ( " % s \ n " , * n a m e s ) ;

    }

    }

    i n t m a i n ( i n t a r g c , c h a r * a r g v ] ) {

    c h a r f r u i t s 4 ] 1 0 ] = { " a p p l e " , " b a n a n a " , " o r a n g e " , " " } ;

    c h a r * v e g ] = { " a r t i c h o k e " , " b e e t r o o t " , " c a r r o t " , ( c h a r * ) N U L L } ;

    l i s t _ n a m e s ( f r u i t s ) ;

    l i s t _ n a m e s 2 ( v e g ) ;

    e x i t ( 0 ) ;

    }

    1 1 E x e r c i s e s 2

    T o a n s w e r t h e s e e x e r c i s e s y o u ' l l n e e d t o b e a b l e t o g e t k e y b o a r d i n p u t f r o m t h e

    u s e r . F o r t h e m o m e n t , u s e t h e f o l l o w i n g f r a g m e n t t o g e t a s t r i n g f r o m t h e u s e r . s t r

    n e e d s t o p o i n t t o t h e s t a r t o f a n e x i s t i n g c h a r a c t e r a r r a y .

    1 9

  • 7/29/2019 ANSIC for Programmers on UNIX Systems

    20/73

    A N S I C f o r P r o g r a m m e r s 1 1 . E X E R C I S E S 2

    c h a r * g e t _ s t r i n g ( c h a r s t r ] )

    {

    p r i n t f ( " I n p u t a s t r i n g \ n " ) ;

    r e t u r n g e t s ( s t r ) ;

    }

    S a m p l e a n s w e r s a r e o n p a g e 6 7 u n l e s s o t h e r w i s e s t a t e d .

    1 . W r i t e y o u r o w n s t r c p y r o u t i n e . U s e a f o r l o o p w i t h a r r a y s r s t , t h e n s e e i f

    y o u c a n u s e a w h i l e l o o p a n d p o i n t e r s .

    2 . T h e f o l l o w i n g c o d e f r a g m e n t u s e s m a n y o f t h e c o n t r a c t i o n s m e n t i o n e d e a r l i e r .

    I t c o m e s f r o m g h o s t s c r i p t . R e - w r i t e i t t o m a k e i t m o r e l e g i b l e .

    i n t c c a s e = ( s k e w > = 0 ? c o p y _ r i g h t :

    ( ( b p t r + = c h u n k _ b y t e s ) , c o p y _ l e f t ) )

    + f u n c t i o n ;

    3 . W r i t e a p r o g r a m t h a t i n v i t e s t h e u s e r t o t y p e i n a s t r i n g a n d p r i n t s t h e s t r i n g

    o u t b a c k w a r d s ( T h e a n s w e r ' s i n s e c t i o n 1 7 ) .

    4 . W r i t e y o u r o w n v e r s i o n o f s t r c h r ( s e e t h e m a n u a l p a g e f o r a d e s c r i p t i o n ) .

    5 . W r i t e a p r o g r a m w h i c h r e a d s i n a s t r i n g l i k e \ 2 0 C " o r \ 1 5 F " a n d o u t p u t s t h e

    t e m p e r a t u r e t o t h e n e a r e s t d e g r e e u s i n g t h e o t h e r s c a l e . T h e e a s i e s t w a y t o

    p a r s e t h e i n p u t s t r i n g i s t o u s e s s c a n f t o s c a n t h e i n p u t s t r i n g f o r a n u m b e r

    a n d a c h a r a c t e r . I t w i l l r e t u r n t h e n u m b e r o f i t e m s s u c c e s s f u l l y r e a d i n .

    i n t d e g r e e s ;

    c h a r s c a l e ;

    i n t r e t u r n _ v a l u e ;

    r e t u r n _ v a l u e = s s c a n f ( s t r , " % d % c " , & d e g r e e s , & s c a l e ) ;

    6 . T h e f o l l o w i n g p r o g r a m w i l l b e d e v e l o p e d l a t e r i n t h e h a n d o u t . S u p p o s e y o u

    h a v e a s i t u a t i o n w h e r e y o u n e e d t o p r o c e s s a s t r e a m o f t h i n g s ( t h e y m i g h t

    b e s c a n n e d c h a r a c t e r i m a g e s , c h e s s p o s i t i o n s o r a s i n t h i s e x a m p l e , s t r i n g s ) ,

    s o m e o f w h i c h m i g h t b e d u p l i c a t e s . T h e p r o c e s s i n g m i g h t b e C P U - i n t e n s i v e ,

    s o y o u ' d r a t h e r u s e t h e p r e v i o u s l y c a l c u l a t e d v a l u e s t h a n r e - p r o c e s s d u p l i c a t e

    e n t r i e s . W h a t ' s n e e d e d i s a l o o k - u p t a b l e

    E a c h e n t r y i n t h e l o o k - u p t a b l e n e e d s t o h a v e a r e c o r d o f t h e o r i g i n a l s t r i n g

    a n d t h e r e s u l t o f t h e p r o c e s s i n g . A s t r u c t u r e o f t y p e E n t r y

    t y p e d e f s t r u c t {

    c h a r s t r 6 4 ] ;

    i n t v a l u e ;

    } E n t r y ;

    w i l l d o f o r n o w . F o r o u r p u r p o s e s i t d o e s n ' t m a t t e r m u c h w h a t t h e p r o c e s s -

    i n g r o u t i n e i s . L e t ' s u s e t h e f o l l o w i n g , m u l t i p l y i n g a l l t h e c h a r a c t e r s ' v a l u e s

    t o g e t h e r .

    2 0

  • 7/29/2019 ANSIC for Programmers on UNIX Systems

    21/73

    A N S I C f o r P r o g r a m m e r s 1 1 . E X E R C I S E S 2

    i n t p r o c e s s ( c h a r * s t r ) {

    i n t v a l = 1 ;

    w h i l e ( * s t r ) {

    v a l = v a l * ( * s t r ) ;

    s t r + + ;

    }

    r e t u r n v a l ;

    }

    T o g e t s t r i n g s i n t o t h e p r o g r a m y o u c a n u s e t h e g e t s t r i n g f u n c t i o n . N o w

    w r i t e a p r o g r a m t h a t r e a d s s t r i n g s f r o m t h e k e y b o a r d . I f t h e s t r i n g i s n e w ,

    t h e n i t ' s p r o c e s s e d , o t h e r w i s e i t s v a l u e i s l o o k e d u p i n a t a b l e . T h e p r o g r a m

    s h o u l d s t o p w h e n ` e n d ' i s t y p e d . H e r e ' s a s k e l e t o n p r o g r a m t o g e t y o u s t a r t e d .

    / * h a s h 1 . c * /

    / * T O D O i n c l u d e s t a n d a r d i n c l u d e f i l e s * /

    / * T h e f o l l o w i n g 2 l i n e s u s e t h e p r e p r o c e s s o r t o c r e a t e a l i a s e s .

    N o t e t h a t t h e s e l i n e s D O N ' T e n d w i t h a ` ; '

    * /

    # d e f i n e T A B L E _ S I Z E 5 0

    # d e f i n e M A X _ S T R _ L E N 6 4

    t y p e d e f s t r u c t {

    c h a r s t r M A X _ S T R _ L E N ] ;

    i n t v a l u e ;

    } E n t r y ;

    c h a r s t r M A X _ S T R _ L E N ] ;

    / * T O D O C r e a t e a n a r r a y o f T A B L E _ S I Z E e l e m e n t s o f t y p e E n t r y * /

    i n t p r o c e s s ( c h a r * s t r ) {

    i n t v a l = 1 ;

    w h i l e ( * s t r ) {

    v a l = v a l * ( * s t r ) ;

    s t r + + ;

    }

    r e t u r n v a l ;

    }

    c h a r * g e t _ s t r i n g ( c h a r s t r ] )

    {

    p r i n t f ( " I n p u t a s t r i n g \ n " ) ;

    r e t u r n g e t s ( s t r ) ;

    }

    m a i n ( ) {

    i n t n u m _ o f _ e n t r i e s = 0 ;

    / * T O D O U s e g e t _ s t r i n g r e p e a t e d l y . F o r e a c h s t r i n g : -

    I f t h e s t r i n g s a y s ` e n d ' , t h e n e x i t .

    I f t h e s t r i s a l r e a d y i n t h e t a b l e ,

    p r i n t t h e a s s o c i a t e d v a l u e

    e l s e

    2 1

  • 7/29/2019 ANSIC for Programmers on UNIX Systems

    22/73

    A N S I C f o r P r o g r a m m e r s 1 1 . E X E R C I S E S 2

    c a l c u l a t e t h e v a l u e , a d d a n e w

    e n t r y t o t h e t a b l e , t h e n p r i n t t h e v a l u e .

    * /

    }

    7 . T h e m e t h o d u s e d a b o v e c a n b e i m p r o v e d u p o n . F i r s t l y , i t w i l l g o w r o n g i f t h e r e

    a r e t o o m a n y s t r i n g s . B y c h o o s i n g a n a r b i t r a r i l y l a r g e v a l u e f o r T A B L E S I Z E

    y o u c o u l d o v e r c o m e t h i s p r o b l e m , b u t t h e m e t h o d o f s e a r c h i n g t h e t a b l e t o

    s e e w h e t h e r a n e n t r y i s n e w b e c o m e s v e r y i n e c i e n t a s t h e t a b l e g r o w s .

    A t e c h n i q u e c a l l e d h a s h i n g c o p e s w i t h t h e s p e e d p r o b l e m . F i r s t w e n e e d a h a s h

    f u n c t i o n w h i c h g i v e n a s t r i n g p r o d u c e s a n u m b e r i n t h e r a n g e 0 . . T A B L E S I Z E

    T h e f o l l o w i n g f u n c t i o n j u s t a d d s u p t h e v a l u e o f t h e c h a r a c t e r s i n t h e s t r i n g

    a n d g e t s t h e r e m a i n d e r a f t e r d i v i d i n g b y T A B L E S I Z E

    i n t h a s h f n ( c h a r * s t r ) {

    i n t t o t a l = 0 ;

    i n t i ;

    w h i l e ( i = * s t r + + )

    t o t a l + = i ;

    r e t u r n t o t a l % T A B L E _ S I Z E ;

    }

    N o w , w h e n e v e r a s t r i n g i s t o b e p r o c e s s e d , i t s h a s h v a l u e i s c a l c u l a t e d a n d

    t h a t i s u s e d a s a n i n d e x i n t o t h e t a b l e , w h i c h i s m u c h q u i c k e r t h a n s e a r c h i n g .

    I f t h a t e n t r y i s e m p t y t h e n t h e s t r i n g i s n e w a n d h a s t o b e p r o c e s s e d . I f t h e

    e n t r y i s o c c u p i e d , t h e n t h e a s s o c i a t e d v a l u e c a n b e a c c e s s e d . T h i s m e t h o d i s

    a w e d , b u t w e ' l l d e a l w i t h t h a t p r o b l e m l a t e r .

    / * h a s h 2 . c * /

    / * T O D O i n c l u d e s t a n d a r d i n c l u d e f i l e s * /

    # d e f i n e T A B L E _ S I Z E 5 0

    # d e f i n e M A X _ S T R _ L E N 6 4

    # d e f i n e E M P T Y - 1

    t y p e d e f s t r u c t {

    c h a r s t r M A X _ S T R _ L E N ] ;

    i n t v a l u e ;

    } E n t r y ;

    c h a r s t r M A X _ S T R _ L E N ] ;

    / * T O D O C r e a t e a n a r r a y o f T A B L E _ S I Z E e l e m e n t s o f t y p e E n t r y * /

    i n t p r o c e s s ( c h a r * s t r ) { / * S a m e a s h a s h 1 . c * /

    i n t v a l = 1 ;

    w h i l e ( * s t r ) {

    v a l = v a l * ( * s t r ) ;

    s t r + + ;

    }

    r e t u r n v a l ;

    }

    c h a r * g e t _ s t r i n g ( c h a r s t r ] ) / * S a m e a s h a s h 1 . c * /

    {

    p r i n t f ( " I n p u t a s t r i n g \ n " ) ;

    2 2

  • 7/29/2019 ANSIC for Programmers on UNIX Systems

    23/73

    A N S I C f o r P r o g r a m m e r s 1 1 . E X E R C I S E S 2

    r e t u r n g e t s ( s t r ) ;

    }

    i n t h a s h f n ( c h a r * s t r ) {

    i n t t o t a l = 0 ;

    i n t i ;

    w h i l e ( i = * s t r + + )

    t o t a l + = i ;

    r e t u r n t o t a l % T A B L E _ S I Z E ;

    }

    v o i d s e t _ t a b l e _ v a l u e s ( v o i d ) {

    / * T O D O s e t a l l t h e v a l u e e n t r i e s i n t h e t a b l e t o E M P T Y

    ( W e ' l l a s s u m e t h a t t h e p r o c e s s ( ) r o u t i n e d o e s n ' t

    p r o d u c e - 1 )

    * /

    }

    i n t f i n d _ e n t r y ( c h a r * s t r , i n t b u c k e t ) {

    / * T O D O

    i f t h e e n t r y i n p o s t i o n ' b u c k e t ' i s E M P T Y t h e n f i l l

    t h e e n t r y ' s f i e l d s i n a n d r e t u r n t h e s t r i n g ' s

    p r o c e s s e d v a l u e , e l s e r e t u r n t h e v a l u e o f t h e e n t r y .

    * /

    }

    m a i n ( ) {

    i n t b u c k e t ;

    i n t v a l ;

    s e t _ t a b l e _ v a l u e s ( ) ;

    / * T O D O U s e g e t _ a _ s t r i n g r e p e a t e d l y . F o r e a c h s t r i n g : -

    u s e t h e h a s h f u n c t i o n t o f i n d t h e s t r i n g ' s e n t r y

    i n t h e t a b l e , t h e n d o t h e f o l l o w i n g

    * /

    b u c k e t = h a s h f n ( s t r )

    v a l = f i n d _ e n t r y ( s t r , b u c k e t ) ;

    p r i n t f ( " V a l u e o f < % s > i s % d \ n " , s t r , v a l ) ;

    }

    8 . T h e p r o b l e m w i t h t h i s m e t h o d i s t h a t t h e h a s h f u n c t i o n m a y p r o d u c e t h e

    s a m e v a l u e f o r d i e r e n t s t r i n g s ( f o r e x a m p l e , ` a c t ' a n d ` c a t ' w i l l b o t h m a p

    i n t o t h e s a m e e n t r y ) . A s i m p l e w a y o f c o p i n g w i t h s u c h ` c o l l i s i o n s ' i s t h e

    f o l l o w i n g : - I f a t a b l e e n t r y i s o c c u p i e d , c h e c k t h e s t r i n g t h e r e t o s e e i f i t ' s t h e

    o n e b e i n g s e a r c h e d f o r . I f i t i s , t h e n r e t u r n t h e a s s o c i a t e d v a l u e . I f i t i s n ' t t h e

    r i g h t s t r i n g , t h e n l o o k a t s u b s e q u e n t e n t r i e s u n t i l e i t h e r

    a n e n t r y f o r t h e s t r i n g i s f o u n d .

    a n e m p t y e n t r y i s f o u n d .

    I t ' s b e e n s h o w n t h a t a l l e n t r i e s a r e f u l l u p .

    Y o u ' l l h a v e t o a d d j u s t a f e w l i n e s t o t h e f i n d e n t r y r o u t i n e o f t h e p r e v i o u s

    e x e r c i s e . R e m e m b e r t o c y c l e r o u n d w h e n t h e b o t t o m o f t h e t a b l e i s r e a c h e d .

    2 3

  • 7/29/2019 ANSIC for Programmers on UNIX Systems

    24/73

    A N S I C f o r P r o g r a m m e r s 1 2 . K E Y W O R D S , O P E R A T O R S A N D D E C L A R A T I O N S

    A m o r e r o b u s t m e t h o d ( a n d t h e a n s w e r t o t h e e x e r c i s e h e r e ) i s i n t h e n e x t s e t

    o f e x e r c i s e s ( s e e s e c t i o n 1 7 ) .

    1 2 K e y w o r d s , O p e r a t o r s a n d D e c l a r a t i o n s

    1 2 . 1 K e y w o r d s

    Y o u c a n ' t u s e t h e f o l l o w i n g r e s e r v e d w o r d s f o r v a r i a b l e n a m e s , e t c .

    a u t o b r e a k c a s e c h a r c o n s t

    c o n t i n u e d e f a u l t d o d o u b l e e l s e

    e n u m e x t e r n f l o a t f o r g o t o

    i f i n t l o n g r e g i s t e r r e t u r n

    s h o r t s i g n e d s i z e o f s t a t i c s t r u c t

    s w i t c h t y p e d e f u n i o n u n s i g n e d v o i d

    v o l a t i l e w h i l e

    A f e w o f t h e s e h a v e n ' t y e t b e e n d e s c r i b e d .

    a u t o : - T h i s i s t h e d e f a u l t S t o r a g e C l a s s f o r v a r i a b l e s s o i t ' s n o t e x p l i c i t l y u s e d .

    s t a t i c , w h i c h y o u ' v e a l r e a d y m e t , i s a n a l t e r n a t i v e c l a s s .

    c o n s t : - I f a v a r i a b l e i s n ' t m e a n t t o c h a n g e y o u c a n d e n e i t a s c o n s t E . g . I f

    y o u c r e a t e a n i n t e g e r u s i n g ` c o n s t i n t i = 6 ; ' t h e n a l a t e r ` i = 7 ; ' w i l l

    b e i l l e g a l . H o w e v e r , i f y o u c r e a t e a p o i n t e r t o i a n d u s e t h i s t o c h a n g e t h e

    v a l u e , y o u ' l l p r o b a b l y g e t a w a y w i t h i t . T h e m a i n p u r p o s e o f c o n s t i s t o h e l p

    o p t i m i s e r s . v o l a t i l e i s t h e o p p o s i t e o f c o n s t

    e n u m : - C h a s e n u m e r a t e d t y p e s , l i k e p a s c a l E . g .

    e n u m c o l o r { R e d , G r e e n , B l u e } ;

    T h e y ' r e n o t a s u s e f u l a s i n p a s c a l b e c a u s e C d o e s n ' t c h e c k i f y o u s e t a n

    e n u m e r a t e d t y p e t o a v a l i d v a l u e .

    r e g i s t e r : - Y o u c a n s u g g e s t t o t h e c o m p i l e r t h a t a v a r i a b l e s h o u l d b e k e p t i n a

    r e g i s t e r f o r f a s t e r a c c e s s . E . g . r e g i s t e r i n t i ' m i g h t h e l p i f i i s a m u c h -

    u s e d i n d e x i n g v a r i a b l e . A n o p t i m i s i n g c o m p i l e r s h o u l d u s e r e g i s t e r s e c i e n t y

    a n y w a y . N o t e t h a t y o u c a n ' t u s e t h e ` & ' o p e r a t o r o n a r e g i s t e r v a r i a b l e .

    1 2 . 2 O p e r a t o r s

    A t l a s t , h e r e i s a t a b l e o f o p e r a t o r s a n d p r e c e d e n c e .

    T h e l i n e s o f t h e t a b l e a r e i n o r d e r o f p r e c e d e n c e , s o ` a * b + 6 ' i s i n t e r p r e t e d

    a s ( a * b ) + 6 ' . W h e n i n d o u b t p u t b r a c k e t s i n !

    T h e A s s o c i a t i v i t y c o l u m n s h o w s h o w t h e o p e r a t o r s g r o u p . E . g .

  • 7/29/2019 ANSIC for Programmers on UNIX Systems

    25/73

    A N S I C f o r P r o g r a m m e r s 1 2 . K E Y W O R D S , O P E R A T O R S A N D D E C L A R A T I O N S

    A s s o c i a t i v i t y O p e r a t o r

    l e f t t o r i g h t ( ) ] , - > , .

    r i g h t t o l e f t ! ( n e g a t i o n ) , ~ ( b i t - n o t )

    + + , - - , - ( u n a r y ) , * ( u n a r y ) , & ( u n a r y ) , s i z e o f

    r i g h t t o l e f t c a s t ( t y p e )

    l e f t t o r i g h t * , / , % ( m o d u l u s )

    l e f t t o r i g h t - +

    l e f t t o r i g h t < < , > >

    l e f t t o r i g h t < , < = , > , > =

    l e f t t o r i g h t = = , ! =

    l e f t t o r i g h t & ( b i t - a n d ) , | ( b i t - o r )

    l e f t t o r i g h t ( b i t - x o r )

    l e f t t o r i g h t & & ( l o g i c a l a n d )

    l e f t t o r i g h t | | ( l o g i c a l o r )

    r i g h t t o l e f t ? :

    r i g h t t o l e f t = , + = , - = , / = , % = , > > = , & =

    l e f t t o r i g h t

    B i t o p e r a t i o n s

    C c a n b e u s e d t o o p e r a t e o n b i t s . T h i s i s u s e f u l f o r l o w - l e v e l p r o g r a m m i n g t h o u g h

    t h e o p e r a t i o n s a r e a l s o u s e d w h e n w r i t i n g X g r a p h i c s a p p l i c a t i o n s .

    S e t t i n g a b i t : - S u p p o s e y o u w a n t e d t o s e t b i t 6 o f i ( a l o n g , s a y ) t o 1 . F i r s t

    y o u n e e d t o c r e a t e a m a s k t h a t h a s a 1 i n t h e 6 t h b i t a n d 0 e l s e w h e r e b y d o i n g

    1 L < < 6 ' w h i c h s h i f t s a l l t h e b i t s o f t h e l o n g 1 l e f t 6 b i t s . T h e n y o u n e e d t o

    d o a b i t - w i s e O R u s i n g ` i = i | ( 1 L < < 6 ) '

    U n s e t t i n g a b i t : - S u p p o s e y o u w a n t e d t o s e t b i t 6 o f i ( a l o n g , s a y ) t o 0 . F i r s t

    y o u n e e d t o c r e a t e a m a s k t h a t h a s a 0 i n t h e 6 t h b i t a n d 1 e l s e w h e r e b y d o i n g

    1 L < < 6 ' t h e n i n v e r t i n g t h e b i t s u s i n g t h e ~ o p e r a t o r . T h e n y o u n e e d t o d o a

    b i t - w i s e A N D u s i n g t h e & o p e r a t o r . T h e w h o l e o p e r a t i o n i s ` i = i & ~ ( 1 < < 6 ) '

    w h i c h c a n b e c o n t r a c t e d t o ` i & = ~ ( 1 < < 6 ) '

    C r e a t i n g a m a s k f o r a n X c a l l : - I n X g r a p h i c s , m a s k s a r e o f t e n c r e a t e d e a c h

    o f w h o s e b i t s r e p r e s e n t a o p t i o n t h a t i s t o b e s e l e c t e d i n s o m e w a y . E a c h b i t

    c a n b e r e f e r r e d t o u s i n g a n a l i a s t h a t h a s b e e n s e t u p i n a n i n c l u d e l e . E . g . a

    m a s k w h i c h c o u l d b e u s e d i n a c a l l t o m a k e a w i n d o w s e n s i t i v e t o k e y p r e s s e s

    a n d b u t t o n p r e s s e s c o u l d b e s e t u p b y d o i n g

    u n s i g n e d i n t m a s k = K e y P r e s s M a s k | B u t t o n P r e s s M a s k ;

    1 2 . 3 D e c l a r a t i o n s

    F i r s t , a n o t e o n t e r m i n o l o g y . A v a r i a b l e i s d e n e d w h e n i t i s c r e a t e d , a n d s p a c e

    i s m a d e f o r i t . A v a r i a b l e i s d e c l a r e d w h e n i t a l r e a d y e x i s t s b u t n e e d s t o b e r e -

    d e s c r i b e d t o t h e c o m p i l e r ( p e r h a p s b e c a u s e i t w a s d e n e d i n a n o t h e r s o u r c e l e ) .

    T h i n k o f d e c l a r i n g i n C l i k e d e c l a r i n g a t c u s t o m s { a d m i t t i n g t o t h e e x i s t e n c e o f

    s o m e t h i n g .

    C d e c l a r a t i o n s a r e n o t e a s y t o r e a d . A n y g o o d b o o k o n C s h o u l d e x p l a i n h o w t o

    r e a d c o m p l i c a t e d C d e c l a r a t i o n s \ i n s i d e o u t " t o u n d e r s t a n d t h e m , s t a r t i n g a t t h e

    v a r i a b l e n a m e a n d w o r k i n g o u t w a r d s b a c k t o t h e b a s e t y p e . Y o u s h o u l d n ' t n e e d t o

    u s e c o m p l i c a t e d d e c l a r a t i o n s s o d o n ' t w o r r y t o o m u c h i f y o u c a n ' t ` d e c o d e ' t h e m .

    K e e p a c r i b s h e e t o f u s e f u l t y p e d e f s a n d p l a y w i t h c d e c l ( s e e s e c t i o n 1 6 . 1 ) .

    A N S I C i n t r o d u c e d t h e u s e o f t h e ` v o i d ' k e y w o r d i n v a r i o u s c o n t e x t s .

    r o u t i n e ( v o i d ) ' { t h e r o u t i n e t a k e s n o a r g u m e n t s .

    2 5

  • 7/29/2019 ANSIC for Programmers on UNIX Systems

    26/73

    A N S I C f o r P r o g r a m m e r s 1 3 . M E M O R Y A L L O C A T I O N

    v o i d r o u t i n e ( i n t i ) ' { t h e r o u t i n e r e t u r n s n o v a l u e .

    v o i d * p t r ' { p t r i s a g e n e r i c p o i n t e r w h i c h s h o u l d b e c a s t i n t o a s p e c i c

    f o r m b e f o r e u s e .

    T h e f o l l o w i n g e x a m p l e s s h o w c o m m o n d e c l a r a t i o n s .

    i n t * p p o i n t e r t o a n i n t

    i n t x 1 0 ] a n a r r a y o f 1 0 i n t s

    i n t ( * x ) 1 0 ] a p o i n t e r t o a n a r r a y o f 1 0 i n t s

    i n t * x 1 0 ] a r r a y o f 1 0 p o i n t e r s t o i n t s

    i n t ( * f ) ( i n t ) p o i n t e r t o a f u n c t i o n t a k i n g a n d r e t u r n i n g a n i n t

    v o i d ( * f ) ( v o i d ) p o i n t e r t o a f u n c t i o n t a k i n g n o a r g s a n d r e t u r n i n g n o t h i n g

    i n t ( * f ] ) ( i n t ) A n a r r a y o f p o i n t e r s t o a f u n c t i o n s t a k i n g a n d r e t u r n i n g a n i n t

    N o t e t h e i m p o r t a n c e o f t h e b r a c k e t s i n t h e s e d e c l a r a t i o n s . I f a d e c l a r a t i o n g e t s

    t o o c o m p l e x i t s h o u l d b e b r o k e n d o w n . F o r e x a m p l e , t h e l a s t e x a m p l e c o u l d b e

    r e w r i t t e n a s

    t y p e d e f i n t ( * P F I ) ( i n t ) / * d e c l a r e P F I a s p o i n t e r t o f u n c t i o n t h a t

    t a k e s a n d r e t u r n s a n i n t . * /

    P F I f ] ;

    1 3 M e m o r y A l l o c a t i o n

    S p a c e i s a u t o m a t i c a l l y s e t a s i d e f o r v a r i a b l e s w h e n t h e y a r e d e n e d , b u t s o m e t i m e s

    y o u d o n ' t k n o w b e f o r e h a n d h o w m a n y v a r i a b l e s y o u ' l l n e e d o r j u s t h o w l o n g a n

    a r r a y m i g h t n e e d t o b e . T h e m a l l o c c o m m a n d c r e a t e s s p a c e , r e t u r n i n g a p o i n t e r

    t o t h i s n e w a r e a . T o i l l u s t r a t e i t s u s e a n d d a n g e r s , h e r e ' s a s e q u e n c e o f a t t e m p t s a t

    w r i t i n g a s t r i n g r e v e r s e r p r o g r a m .

    # i n c l u d e < s t d i o . h >

    # i n c l u d e < s t d l i b . h >

    v o i d p r i n t _ r e v e r s e ( c h a r * s t r )

    {

    i n t i ;

    u n s i g n e d i n t l e n ;

    l e n = s t r l e n ( s t r ) - 1 ; / * W h y t h e - 1 ? B e c a u s e a r r a y s s t a r t a t 0 ,

    s o i f a s t r i n g h a s n c h a r s , t h e

    l a s t c h a r w i l l b e a t p o s i t i o n n - 1

    * /

    f o r ( i = l e n ; i > = 0 ; i - - )

    p u t c h a r ( s t r i ] ) ;

    }

    v o i d m a i n ( )

    {

    c h a r i n p u t _ s t r 1 0 0 ] / * w h y 1 0 0 ? * /

    p r i n t f ( " I n p u t a s t r i n g \ n " ) ;

    g e t s ( i n p u t _ s t r ) ; / * s h o u l d c h e c k r e t u r n v a l u e * /

    p r i n t f ( " S t r i n g w a s % s \ n " , i n p u t _ s t r ) ;

    p r i n t _ r e v e r s e ( i n p u t _ s t r ) ;

    }

    2 6

  • 7/29/2019 ANSIC for Programmers on UNIX Systems

    27/73

    A N S I C f o r P r o g r a m m e r s 1 3 . M E M O R Y A L L O C A T I O N

    T h i s w o r k s , b u t i s a b i t ` l o o s e ' ( s u p p o s e t h e u s e r t y p e s m o r e t h a n 1 0 0 c h a r a c -

    t e r s ? ) a n d d o e s n ' t k e e p a c o p y o f t h e r e v e r s e d s t r i n g s h o u l d i t b e n e e d e d l a t e r .

    T h e n e x t e x a m p l e s h o w s a w r o n g ( b u t n o t u n c o m m o n ) a t t e m p t t o s o l v e t h e l a t t e r

    l i m i t a t i o n .

    # i n c l u d e < s t d i o . h >

    / * W R O N G ! * /

    c h a r * m a k e _ r e v e r s e ( c h a r * s t r )

    {

    i n t i , j ;

    u n s i g n e d i n t l e n ;

    c h a r n e w s t r 1 0 0 ] ;

    l e n = s t r l e n ( s t r ) - 1 ;

    j = 0 ;

    f o r ( i = l e n ; i > = 0 ; i - - ; )

    n e w s t r j ] = s t r i ] ;

    j + + ;

    / * n o w r e t u r n a p o i n t e r t o t h i s n e w s t r i n g * /

    r e t u r n n e w s t r ;

    }

    v o i d m a i n ( )

    {

    c h a r i n p u t _ s t r 1 0 0 ] ; / * w h y 1 0 0 ? * /

    c h a r * c _ p t r ;

    p r i n t f ( " I n p u t a s t r i n g \ n " ) ;

    g e t s ( i n p u t _ s t r ) ; / * s h o u l d c h e c k r e t u r n v a l u e * /

    c _ p t r = m a k e _ r e v e r s e ( i n p u t _ s t r ) ;

    p r i n t f ( " S t r i n g w a s % s \ n " , i n p u t _ s t r ) ;

    p r i n t f ( " R e v e r s e d s t r i n g i s % s \ n " , c _ p t r ) ;

    }

    L i k e m a n y a w e d C p r o g r a m s t h i s w i l l w o r k m u c h o f t h e t i m e , e s p e c i a l l y i f i t ' s

    n o t p a r t o f a b i g g e r p r o g r a m . T h e p r o b l e m s a r e t h a t : -

    T h e m e m o r y a l l o c a t e d f o r n e w s t r w h e n i t w a s d e c l a r e d a s a n ` a u t o m a t i c ' v a r i -

    a b l e i n m a k e r e v e r s e i s n ' t p e r m a n e n t { i t o n l y l a s t s a s l o n g a s m a k e r e v e r s e ( )

    t a k e s t o e x e c u t e . H o w e v e r , t h e a r r a y ' s c o n t e n t s a r e n ' t e r a s e d , t h e y ' r e j u s t

    f r e e d f o r l a t e r u s e , s o i f y o u a c c e s s t h e a r r a y f r o m m a i n y o u m i g h t s t i l l g e t

    a w a y w i t h i t f o r a w h i l e . M a k i n g n e w s t r a s t a t i c w i l l p r e s e r v e t h e d a t a b u t

    o n l y u n t i l i t ' s o v e r w r i t t e n b y a s u b s e q u e n t c a l l .

    T h e n e w l y c r e a t e d a r r a y o f c h a r a c t e r s , n e w s t r , i s n ' t t e r m i n a t e d w i t h a z e r o

    c h a r a c t e r , ` \ 0 ' , s o t r y i n g t o p r i n t t h e c h a r a c t e r s o u t a s a s t r i n g m a y b e

    d i s a s t r o u s . ` L u c k i l y ' t h e m e m o r y l o c a t i o n t h a t s h o u l d h a v e b e e n s e t t o z e r o

    i s l i k e l y t o b e z e r o a n y w a y .

    L e t ' s t r y a g a i n .

    / * m a l l o c i n g . c * /

    # i n c l u d e < s t d i o . h >

    # i n c l u d e < s t d l i b . h >

    c h a r * m a k e _ r e v e r s e ( c h a r * s t r )

    {

    i n t i ;

    2 7

  • 7/29/2019 ANSIC for Programmers on UNIX Systems

    28/73

    A N S I C f o r P r o g r a m m e r s 1 4 . I N P U T / O U T P U T

    u n s i g n e d i n t l e n ;

    c h a r * r e t _ s t r , * c _ p t r ;

    l e n = s t r l e n ( s t r ) ;

    / * C r e a t e e n o u g h s p a c e f o r t h e s t r i n g A N D t h e f i n a l \ 0 .

    * /

    r e t _ s t r = ( c h a r * ) m a l l o c ( l e n + 1 ) ;

    / *

    N o w r e t _ s t r p o i n t s t o a ` p e r m a n e n t ' a r e a o f m e m o r y .

    * /

    / * P o i n t c _ p t r t o w h e r e t h e f i n a l ' \ 0 ' g o e s a n d p u t i t i n * /

    c _ p t r = r e t _ s t r + l e n ;

    * c _ p t r = ' \ 0 ' ;

    / * n o w c o p y c h a r a c t e r s f r o m s t r i n t o t h e n e w l y c r e a t e d s p a c e .

    T h e s t r p o i n t e r w i l l b e a d v a n c e d a c h a r a t a t i m e ,

    t h e c p t r p o i n t e r w i l l b e d e c r e m e n t e d a c h a r a t a t i m e .

    * /

    w h i l e ( * s t r ! = 0 ) { / * w h i l e s t r i s n ' t p o i n t i n g t o t h e l a s t ' \ 0 ' * /

    c _ p t r - - ;

    * c _ p t r = * s t r ;

    s t r + + ; / * i n c r e m e n t t h e p o i n t e r s o t h a t i t p o i n t s t o e a c h

    c h a r a c t e r i n t u r n . * /

    }

    r e t u r n r e t _ s t r ;

    }

    v o i d m a i n ( )

    {

    c h a r i n p u t _ s t r 1 0 0 ] ; / * w h y 1 0 0 ? * /

    c h a r * c _ p t r ;

    p r i n t f ( " I n p u t a s t r i n g \ n " ) ;

    g e t s ( i n p u t _ s t r ) ; / * S h o u l d c h e c k r e t u r n v a l u e * /

    c _ p t r = m a k e _ r e v e r s e ( i n p u t _ s t r ) ;

    p r i n t f ( " S t r i n g w a s % s \ n " , i n p u t _ s t r ) ;

    p r i n t f ( " R e v e r s e d s t r i n g i s % s \ n " , c _ p t r ) ;

    }

    T h e m a l l o c ' e d s p a c e w i l l b e p r e s e r v e d u n t i l i t i s e x p l i c i t l y f r e e d ( i n t h i s c a s e

    b y d o i n g ` f r e e ( c p t r ) ' ) . N o t e t h a t t h e p o i n t e r t o t h e m a l l o c ' e d s p a c e i s t h e o n l y

    w a y y o u h a v e t o a c c e s s t h a t m e m o r y : l o s e i t a n d t h e m e m o r y w i l l b e i n a c c e s s i b l e .

    I t w i l l o n l y b e f r e e d w h e n t h e p r o g r a m n i s h e s .

    m a l l o c i s o f t e n u s e d t o c r e a t e t r e e a n d l i s t s t r u c t u r e s , s i n c e o n e o f t e n d o e s n ' t

    k n o w b e f o r e h a n d h o w m a n y i t e m s w i l l b e n e e d e d . S e e s e c t i o n A . 4 f o r a n e x a m p l e .

    1 4 I n p u t / O u t p u t

    1 4 . 1 F i l e I / O u n d e r U n i x

    S o m e l e o p e r a t i o n s w o r k o n l e p o i n t e r s a n d s o m e l o w e r l e v e l o n e s u s e s m a l l

    i n t e g e r s c a l l e d l e d e s c r i p t o r s ( a n i n d e x i n t o a t a b l e o f i n f o r m a t i o n a b