6.
087 Lecture 4 January 14, 2010
Review
Control ow
I/O Standard I/O String I/O File I/O
Blocks
Blocks combine multiple statements into a single unit. Can be used when a single statement is expected. Creates a local scope (variables declared inside are local
to the block).
Blocks can be nested.
{ i n t x =0; { i n t y =0; / both x and y v i s i b l e /
}
/ only x v i s i b l e / }
Conditional blocks
if ... else..else if
is used for conditional branching of execution
i f ( cond ) { / code executed i f cond i s t r u e / } else { / code executed i f cond i s f a l s e / }
Conditional blocks
switch..case
is used to test multiple conditions (more efcient than if else ladders).
switch ( o p t ) { case A : / execute i f o p t == A / break ;
case B :
case C :
/ execute i f o p t == B | | o p t == C / default : }
Iterative blocks
while loop tests condition before execution of the block. do..while loop tests condition after execution of the block. for loop provides initialization, testing and iteration together.
6.087 Lecture 4 January 14, 2010
Review
Control ow
I/O Standard I/O String I/O File I/O
goto
goto allows you to jump unconditionally to arbitrary part of
your code (within the same function).
the location is identied using a label. a label is a named location in the code. It has the same
form as a variable followed by a :
start : { i f ( cond ) goto o u t s i d e ; / some code / goto s t a r t ; } outside : / outside block /
Spaghetti code
Dijkstra. Go To Statement Considered Harmful. Communications of the ACM 11(3),1968
Excess use of goto creates sphagetti code. Using goto makes code harder to read and debug. Any code that uses goto can be written without using one.
error handling
Language like C++ and Java provide exception mechanism to recover from errors. In C, goto provides a convenient way to exit from nested blocks.
c o n t _ f l a g =1; for ( . . ) { for ( i n i t ; cont_flag ; i t e r ) { i f ( error_cond ) { c o n t _ f l a g =0; break ; } / inner loop / } i f ( ! c o n t _ f l a g ) break ; / outer loop / }
7
for ( . . ) { for ( . . ) { i f ( error_cond ) goto e r r o r ; / skips 2 blocks / } } error :
6.087 Lecture 4 January 14, 2010
Review
Control ow
I/O Standard I/O String I/O File I/O
Preliminaries
Input and output facilities are provided by the standard
library <stdio.h> and not by the language itself.
A text stream consists of a series of lines ending with \n.
The standard library takes care of conversion from
\r\n\n
A binary stream consists of a series of raw bytes. The streams provided by standard library are buffered.
Standard input and output
int putchar(int)
putchar(c) puts the character c on the standard output. it returns the character printed or EOF on error.
int getchar()
returns the next character from standard input.
it returns EOF on error.
Standard input and output
What does the following code do?
i n t main ( ) { char c ; while ( ( c= g e t c h a r ( ) ) ! = EOF) { i f ( c>=A && c<=Z )
c=cA+a ;
p u t c h a r ( c ) ;
}
r e t u r n 0 ;
}
To use a le instead of standard input, use < operator (*nix).
Normal invocation: ./a.out Input redirection: a.out < le.txt. Treats le.txt as source of
standard input.This is an OS feature, not a language feature.
10
Standard output:formatted
int printf (char format [], arg1,arg2 ,...)
printf() can be used for formatted output. It takes in a variable number of arguments. It returns the number of characters printed. The format can contain literal strings as well as format
speciers (starts with %). Examples:
p r i n t f ( "hello world\n" ) ; p r i n t f ( "%d\n" , 1 0 ) ; / f o r m a t : %d ( i n t e g e r ) , argument : 1 0 / p r i n t f ( "Prices:%d and %d\n" , 1 0 , 2 0 ) ;
11
printf format specication
The format specication has the following components
%[ags ][ width ][. precision ][ length]<type>
type: type d,i x,X u c s f d e,E % meaning integer integer (hex) unsigned integer character string oat double oat(exp) literal % example
printf ("%d",10); /prints 10/ printf ("%x",10); / print 0xa/ printf ("%u",10); /prints 10/ printf ("%c",A); /prints A/ printf ("%s","hello"); /prints hello/ printf ("%f",2.3); / prints 2.3/ printf ("%d",2.3); / prints 2.3/ 1e3,1.2E3,1E3 printf ("%d %%",10); /prints 10%/
12
printf format specication (cont.)
%[ags ][ width ][. precision ][ modier]<type>
width: format
printf ("%d",10) printf ("%4d",10) printf ("%s","hello") printf ("%7s","hello")
output "10" bb10 (b:space) hello bbhello
13
printf format specication (cont.)
%[ags ][ width ][. precision ][ modier]<type>
ag: format
printf ("%d,%+d,%+d",10,10) printf ("%04d",10) printf ("%7s","hello") printf ("%-7s","hello")
output 10,+10,-10 0010 bbhello hellobb
14
printf format specication (cont.)
%[ags ][ width ][. precision ][ modier]<type>
precision: format
printf ("%.2f,%.0f,1.141,1.141) printf ("%.2e,%.0e,1.141,100.00) printf ("%.4s","hello") printf ("%.1s","hello")
output 1.14,1 1.14e+00,1e+02 hell h
15
printf format specication (cont.)
%[ags ][ width ][. precision ][ modier]<type>
modier: modier h l L meaning interpreted as short. Use with i,d,o,u,x interpreted as long. Use with i,d,o,u,x interpreted as double. Use with e,f,g
16
Digression: character arrays
Since we will be reading and writing strings, here is a brief digression
strings are represented as an array of characters C does not restrict the length of the string. The end of the
string is specied using 0. For instance, "hello" is represented using the array {h,e,l,l,\0}. Declaration examples:
char str []= "hello"; /compiler takes care of size/ char str[10]="hello"; /make sure the array is large enough/ char str []={ h,e,l,l,0};
Note: use \" if you want the string to contain ".
17
Digression: character arrays
Comparing strings: the header le <string .h> provides the function int strcmp(char s[],char t []) that compares two strings in dictionary order (lower case letters come after capital case).
the function returns a value <0 if s comes before t the function return a value 0 if s is the same as t the function return a value >0 if s comes after t strcmp is case sensitive
Examples
strcmp("A","a") /<0/ strcmp("IRONMAN","BATMAN") />0/ strcmp("aA","aA") /==0/ strcmp("aA","a") />0/
18
Formatted input
int scanf(char format ,...)
is the input analog of printf.
scanf reads characters from standard input, interpreting
them according to format specication
Similar to printf , scanf also takes variable number of
arguments.
The format specication is the same as that for printf When multiple items are to be read, each item is assumed
to be separated by white space.
It returns the number of items read or EOF.
Important: scanf ignores white spaces. Important: Arguments have to be address of variables
(pointers).
19
Formatted input
int scanf(char format ,...)
is the input analog of printf.
Examples:
printf ("%d",x) printf ("%10d",x) printf ("%f",f) printf ("%s",str) printf ("%s",str) printf ("%s %s",fname,lname)
scanf("%d",&x) scanf("%d",&x) scanf("%f",&f) scanf("%s",str) /note no & required/ scanf("%20s",str) /note no & required/ scanf("%20s %20s",fname,lname)
20
String input/output
Instead of writing to the standard output, the formatted data can
be written to or read from character arrays.
int sprintf (char string [], char format [], arg1,arg2)
The format specication is the same as printf. The output is written to string (does not check size). Returns the number of character written or negative value
on error.
int sscanf(char str [], char format [], arg1,arg2)
The format specication is the same as scanf; The input is read from str variable. Returns the number of items read or negative value on
error.
21
File I/O
So far, we have read from the standard input and written to the
standard output. C allows us to read data from text/binary les
using fopen().
FILE fopen(char name[],char mode[])
mode can be "r" (read only),"w" (write only),"a" (append)
among other options. "b" can be appended for binary les.
fopen returns a pointer to the le stream if it exists or
NULL otherwise.
We dont need to know the details of the FILE data type. Important: The standard input and output are also FILE*
datatypes (stdin,stdout).
Important: stderr corresponds to standard error
output(different from stdout).
22
File I/O(cont.)
int fclose (FILE fp)
closes the stream (releases OS resources). fclose() is automatically called on all open les when
program terminates.
23
File input
int getc(FILE fp)
reads a single character from the stream. returns the character read or EOF on error/end of le.
Note: getchar simply uses the standard input to read a character. We can implement it as follows:
#dene getchar() getc(stdin )
char[] fgets(char line [], int maxlen,FILE fp)
reads a single line (upto maxlen characters) from the input
stream (including linebreak).
returns a pointer to the character array that stores the line
(read-only)
return NULL if end of stream.
24
File output
int putc(int c,FILE fp)
writes a single character c to the output stream. returns the character written or EOF on error.
Note: putchar simply uses the standard output to write a character. We can implement it as follows:
#dene putchar(c) putc(c,stdout)
int fputs(char line [], FILE fp)
writes a single line to the output stream. returns zero on success, EOF otherwise.
int fscanf(FILE fp,char format [], arg1,arg2)
similar to scanf,sscanf reads items from input stream fp.
25
Command line input
In addition to taking input from standard input and les, you
can also pass input while invoking the program.
Command line parameters are very common in *nix
environment.
So far, we have used int main() as to invoke the main
function. However, main function can take arguments that are populated when the program is invoked.
26
Command line input (cont.)
int main(int argc,char argv[])
argc: count of arguments. argv[]: an array of pointers to each of the arguments note: the arguments include the name of the program as
well. Examples:
./cat a.txt b.txt (argc=3,argv[0]="cat" argv[1]="a.txt"
argv[2]="b.txt"
./cat (argc=1,argv[0]="cat")
27
MIT OpenCourseWare http://ocw.mit.edu
6.087 Practical Programming in C
January (IAP) 2010
For information about citing these materials or our Terms of Use,visit: http://ocw.mit.edu/terms.