Upload
carlos-lopez-martinez
View
222
Download
0
Embed Size (px)
Citation preview
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