Strings and Text Files in C

Computer Science 210
Computer Organization
Strings and Text Files in C
Representing Strings
printf("Hi Ken!\n");
'H'
'i'
' '
'K'
'e'
'n'
'!'
'\n'
nul
A string is a set of ASCII values that inhabit a sequence of
bytes
A string should always end in a nul character (ASCII 0)
Many string functions use nul as a sentinel
The String “Type” and Variables
char *greeting = "Hi Ken!\n";
printf("%s", greeting);
greeting
'H'
'i'
' '
'K'
'e'
'n'
'!'
'\n'
nul
The pointer to a char named greeting holds the
address of the first byte
The standard string processing functions view strings as
of type char*
The String “Type” and Variables
char *greeting = "Hi Ken!\n";
printf("%s", greeting);
greeting
'H'
'i'
' '
'K'
GREETING .STRINGz "Hi Ken!\n"
LEA R0, GREETING
PUTS
'e'
'n'
'!'
'\n'
nul
View a String as an Array of char
char *greeting = "Hi Ken!\n";
int i = 0;
for (; greeting[i] != 0; i++)
putchar(greeting[i]);
greeting
'H'
'i'
' '
'K'
'e'
'n'
'!'
'\n'
nul
A string looks like an array in memory
So, we can use an index to access or modify a character in
any cell
The string Library and strlen
#include <string.h>
char *greeting = "Hi Ken!\n";
int i = 0;
for (; i < strlen(greeting); i++)
putchar(greeting[i]);
greeting
'H'
'i'
' '
'K'
'e'
'n'
'!'
'\n'
nul
The string library includes several common string
functions (length, concatenation, comparison, etc.)
strlen is O(n), because it searches for the nul
character
The string Library
Function
What it does
int strlen(char *str)
Returns the number of characters in the
string, not including the nul character.
strcmp(char *str1, char *str2)
Returns 0 if str1 equals str2, a negative
integer if str1 < str2, or a positive
integer if str1 > str2.
strcat(char *str1, char *str2)
Adds the characters in str2 to the end of
str1, overwriting its nul character.
strcpy (char *str1, char *str2)
Copies the characters of str2 into the
storage of str1. There must be enough
storage!
You can pass either a char* or a char array to these functions
The ctype Library
#include <string.h>
#include <ctype.h>
char *greeting = "Hi Ken!\n";
int i = 0;
for (; i < strlen(greeting); i++)
greeting[i] = toupper(greeting[i]);
greeting
'H'
'I'
' '
'K'
'E'
'N'
'!'
'\n'
nul
The ctype library includes several common character
functions (test for letter or digit, convert to uppercase,
etc.)
String Input with scanf
#include <stdio.h>
int main(){
char name[20];
printf("Enter your first name: ");
scanf("%s", name);
printf("%s\n", name);
}
scanf stops at the first whitespace character and adds a
nul character (works for one-word inputs)
Must pass scanf the storage, usually an array of char
String Input with gets
#include <stdio.h>
int main(){
char name[20];
printf("Enter your first name: ");
gets(name);
printf("%s\n", name);
}
gets stops at the first newline character, which is not
included, and adds a nul character (works for multi-word
inputs)
Must pass gets the storage, usually an array of char
Other Points about Strings
• Can be the element type of an array
• Can be the type of a field in a struct
Example: The Argument Vector
• The argument vector is an array of strings that are
gathered up when a C program is run at the
command prompt
• The first string is the name of the command
• The remaining strings are the arguments, if any
• The argument vector and its length are optional
formal parameters of the main function
Print the Command Line Arguments
/*
Prints contents of the argument vector (the name of the program and
any command-line arguments).
*/
#include <stdio.h>
int main(int length, char *argVec[]){
int i;
for (i = 0; i < length; i++)
printf("Argument %d: %s\n", i, argVec[i]);
}
Opening Files for I/O
#include <stdio.h>
int main(){
FILE *infile = fopen("test.asm", "r");
FILE *outfile = fopen("test.bin", "w");
if (infile == NULL)
printf("The input file does not exist.\n");
else{
processFile(infile, outfile);
fclose(infile);
fclose(outfile);
}
}
Syntax: fopen(fileName, modeString)
Text File I/O Functions
Function
What it does
char* fgets(char* array,
int arraySize,
FILE *infile)
Returns NULL if end of file. Otherwise, loads
the next line, including the newline and nul
characters, into array. Note: there must be
storage for array!
int fputs(char* array,
FILE *outfile)
Returns EOF if the string cannot be written to
outfile. Otherwise, writes the string to
outfile. A newline is not automatically
written.
fprintf(FILE *outfile,
char* formatString,
arg1, . . ., argn)
Works just like printf with the standard
output file (the terminal)
Example: Create a Numbered
Listing
void processFile(FILE *infile, FILE *outfile){
int max = 80;
int fieldWidth = 4;
char line[max];
int lineNumber = 1;
while (fgets(line, max, infile)){
fprintf(outfile, "%*d%s", fieldWidth, lineNumber, "> ");
fputs(line, outfile);
lineNumber++;
}
}
"%*d" allows a variable to be used as a field width for a
datum
The variable for the field width precedes the datum being
formatted
The Standard I/O Files
• stdin names the standard input file,
which is the keyboard
• stdout names the standard output file,
which is the terminal screen
• Both variables are of type FILE*
Example: Print to File or Terminal
int main(int length, char *argVec[]){
if (length == 1)
return;
FILE *infile = fopen(argVec[1], "r");
if (infile == NULL){
printf("The input file does not exist in this directory\n");
return;
}
FILE *outfile;
if (length == 3)
outfile = fopen(argVec[2], "w");
// Using an output file
else
outfile = stdout;
// Using the terminal
processFile(infile, outfile);
fclose(infile);
if (outfile != stdout)
fclose(outfile);
}
For Monday
Pointers and Dynamic Storage