Bilgisayar Mhendislii Blm
Computer Programming
Strings
GIT Computer Engineering Department
Introduction
String: group of characters
Bilgisayar Mhendislii Blm
Implemented as arrays of char Essential for several applications manipulating textual data
Word processing Databases Scientific computing (Ex: DNA sequence, chemical compounds)
Already used string constants
printf and scanf format strings
GIT Computer Engineering Department
String Variables
char string_var[30];
Bilgisayar Mhendislii Blm
Declaration: same as declaring array of chars
The variable string_var can hold a string of 0 to 29 characters
Not 30!.. How is varying size handled? Use of null character: \0
String variables can be initialized char string_var[30] = initial value; char str[] = initial value; What is the size of str? The part of array after null character is ignored
GIT Computer Engineering Department
Arrays of Strings
Bilgisayar Mhendislii Blm
An array of strings: a two-dimensional array of chars
Ex: Array of 30 names which is less than 25 characters
#define NUM_PEOPLE 30 #define NAME_LEN 25 char names[NUM_PEOPLE][NAME_LEN];
Ex: Array of 12 month names
char months[12][10] = {January, February, March, April, June, July, August, September, October, November, December};
GIT Computer Engineering Department
Input/Output of Strings
Bilgisayar Mhendislii Blm
Place holder: %s printf prints characters until null character
printf(The value is: %s \n, string_var); What if the array does not contain null character? Do not forget to insert null character while building strings
This is automatic for constant strings
printf(***%7s**** \n, Ali); printf(***%7s**** \n, MehmedAli); printf(***%-7s**** \n, Ali);
GIT Computer Engineering Department
Input/Output of Strings
Place holder: %s scanf can used to input strings scanf(%s, string_var);
Remember string_var is an array
Bilgisayar Mhendislii Blm
scanf
skips leading whitespace characters copies subsequent characters in memory cells copying stops when a whitespace character is seen places a null character at the end of string
EX: See following simple example..
GIT Computer Engineering Department
Input/Output of Strings
Bilgisayar Mhendislii Blm
GIT Computer Engineering Department
Input/Output of Strings
Bilgisayar Mhendislii Blm
How to enter the values in previous example?
In more than one line or in diferent formats?
> 1270 TR 1800 > MATH 1270 TR 1800 > MATH1270 TR 1800 > MATH,1270,TR,1800 MATH
GIT Computer Engineering Department
Input/Output of Strings
Bilgisayar Mhendislii Blm
EX: Read in 30 names together with their ages
#define NUM_PEOPLE 30 #define NAME_LEN 25 char names[NUM_PEOPLE][NAME_LEN]; int ages[NUM_PEOPLE]; for(..){ .. }
GIT Computer Engineering Department
String Library Functions: Assignment
Assignment operator: =
Used for assigning simple types Can not be used for arrays and strings
Other than in declaration with initialization What is array name without subscript? char str[20]; str = test value;
Bilgisayar Mhendislii Blm
C provides library function for assignment
Library in string.h Includes several operations
Substring functions, concatenation, comparison, length, etc
GIT Computer Engineering Department
String Library Functions
Bilgisayar Mhendislii Blm
GIT Computer Engineering Department
String Assignment
strcpy
strcpy(str, test value);
Bilgisayar Mhendislii Blm
Be careful about overflow!
strcpy(str, A very long string test value );
strncpy : copies first n characters
strncpy(str, test value, 20);
Be careful to copy a valid string!
strncpy(str, A very long string test value, 20);
Safer to use
strncpy(str, A very long string test value, 19); str[19] = \0;
GIT Computer Engineering Department
Substring copy
char result[10], s1[15] = Jan. 30, 1996; strncpy(result, s1, 9);
Bilgisayar Mhendislii Blm
GIT Computer Engineering Department
Substring copy
char result[10], s1[15] = Jan. 30, 1996;
strncpy(result, &s1[5], 2);
Bilgisayar Mhendislii Blm
GIT Computer Engineering Department
Substring copy
char result[10], s1[15] = Jan. 30, 1996;
strcpy(result, &s1[9]);
Bilgisayar Mhendislii Blm
GIT Computer Engineering Department
Separate Compounds into Elemental Components
Bilgisayar Mhendislii Blm
Ex: Break compound names into their elemental components
Assume element names start with a capital letter Assume ASCII character set
Use strncpy
to copy parts of compound names into elemental components
Use strlen
To check termination of the loop
GIT Computer Engineering Department
Separate Compounds into Elemental Components
Bilgisayar Mhendislii Blm
GIT Computer Engineering Department
Concatenation
Bilgisayar Mhendislii Blm
Add a string at the end of the other string strcat and strncat
Assumes sufficient space available for the concatenated string
char f[15] = Fatih , m[15] = Erdogan , l[15] = Sevilgen; strcat(f, l); strcat(m, l); printf(%d %d \n, strlen(m), strlen(l)) strncat(m, l, 5); printf(%d \n, strncat(m, l, 15 - strlen(m) - 1));
GIT Computer Engineering Department
Scanning a Full Line
Input one complete line of data
Bilgisayar Mhendislii Blm
Do not stop at space or tab characters Do not store end-of-line (new-line, return, enter) character char line[80]; gets(line);
File input, fgets has different format
Final character is always \0 Stores \n character if the line is not truncated fgets(line, 80, inp);
GIT Computer Engineering Department
Scanning a Full Line
Bilgisayar Mhendislii Blm
Ex: Scans a data file and create a new doublespaced version with line numbers
GIT Computer Engineering Department
Bilgisayar Mhendislii Blm
GIT Computer Engineering Department
String Comparison
Bilgisayar Mhendislii Blm
Comparison operators can not be used
Strings are implemented as arrays What is the meaning of string1 < string2 strcmp: compares two strings and returns an integer strcmp(str1,str2) Has negative value if str1 is less than str2 Has value 0 if str1 is equal to str2 Has positive value if str1 is greater than str2 strncmp: compares first n characters
GIT Computer Engineering Department
Sentinel-Controlled Loop for String Input
Bilgisayar Mhendislii Blm
GIT Computer Engineering Department
Sorting and Searching
char list[30][20]; Comparison Swap
Bilgisayar Mhendislii Blm
Sorting a list of words (array of strings)
What do we mean by list[i]?
GIT Computer Engineering Department
Executing strcpy(list[index_of_min], list[fill]);
Bilgisayar Mhendislii Blm
GIT Computer Engineering Department
Arrays of Pointers
Three copy operations per exchange
Bilgisayar Mhendislii Blm
Previous example requires a lot of copying of characters to sort a list of strings Alternative approach: use arrays of pointers
Pointers to strings (arrays) Sort the pointers not the strings Saves the original order as well.
GIT Computer Engineering Department
Arrays of Pointers
char orignal[5][10]; for(i = 0; i < 5; ++i) printf(%s\n, alphap[i]); for(i = 0; i < 5; ++i) printf(%s\n, original[i]);
Bilgisayar Mhendislii Blm
How to define alphap array?
char *alphap[5];
How to initalize alphap array?
for(i = 0; i < 5; ++i) alphap[i] = original[i];
GIT Computer Engineering Department
Arrays of Pointers
Arrays of pointers has several advantages
Can represents many orderings
All refers to the same string One corrected all corrected
Bilgisayar Mhendislii Blm
Requires less space
Pointer vs string
Can sort faster
Array of String constants
char months[12][10] = {January, February, March, April, June, July, August, September, October, November, December}; char *months[] = {January, February, March, April, June, July, August, September, October, November, December};
GIT Computer Engineering Department
Arrays of Pointers
Bilgisayar Mhendislii Blm
EX: Input a list of names and access it in sorted order and original order.
GIT Computer Engineering Department
Two Orderings of One List
Bilgisayar Mhendislii Blm
GIT Computer Engineering Department
Bilgisayar Mhendislii Blm
GIT Computer Engineering Department
Bilgisayar Mhendislii Blm
GIT Computer Engineering Department
Bilgisayar Mhendislii Blm
GIT Computer Engineering Department
Character Operations
Include ctype.h
Bilgisayar Mhendislii Blm
Strings processing usually requires character manipulation Character library provides several functions
Character I/O getchar
returns the next character from standard input Return value of getchar is an integer.
Return EOF if getchar end-of-file is reached. The value of EOF is -1 which is not of type char
ch = getchar();
scanf(%c,&ch);
getc: get a single character from a file putchar and putc are used to display a character
putchar(a); putc(a,outp);
GIT Computer Engineering Department
scanline Function Using getchar
Bilgisayar Mhendislii Blm
GIT Computer Engineering Department
Character Analysis and Conversion
Bilgisayar Mhendislii Blm
GIT Computer Engineering Department
Greater-Than Operator Ignoring Case
Bilgisayar Mhendislii Blm
GIT Computer Engineering Department
String-Number Conversion
Bilgisayar Mhendislii Blm
scanf and printf uses such a conversion
GIT Computer Engineering Department
String-Number Conversion
Bilgisayar Mhendislii Blm
GIT Computer Engineering Department
String-Number Conversion
Bilgisayar Mhendislii Blm
sscanf and sprintf similar to scanf and printf
They perform the operation on a string sscanf: reads input from the parameter string sprintf: outputs into the parameter string char s[100]; sprintf(s, %d/%d/%d, mon, day, year); sscanf( 85 96.5 hello, %d %lf %s, &n, &f, w); You can read the entire data as a line of input, verify its format and convert to correct values using sscanf
GIT Computer Engineering Department
Validate Input Line Before Storing Values
Bilgisayar Mhendislii Blm
GIT Computer Engineering Department
Ex: Date Conversion
Date representations
(12 June 1968)
Bilgisayar Mhendislii Blm
string containing day month name and year three integers (day month year)
(12 6 1968)
Convert a string representation of date to three integer representation and vice versa
GIT Computer Engineering Department
Bilgisayar Mhendislii Blm
GIT Computer Engineering Department
Bilgisayar Mhendislii Blm
GIT Computer Engineering Department
Bilgisayar Mhendislii Blm
GIT Computer Engineering Department
Figure 9.18 Functions That Convert Representations of Dates (contd)
Bilgisayar Mhendislii Blm
GIT Computer Engineering Department
Case Study: Text Editor
Locate a target string Delete a substring Insert a substring at a location
Bilgisayar Mhendislii Blm
Problem: Editing operations on a line of text:
Analysis:
Keep the source line to edit Get the operation until it is Q
Data Requirements
source array command
GIT Computer Engineering Department
Sample Run of Text Editor
Bilgisayar Mhendislii Blm
GIT Computer Engineering Department
Case Study: Text Editor
Algorithm
1. Scan the string 2. Get an edit command 3. While command is not Q 4. Perform operation 4.1 switch command D: 4.2 Get the substring 4.3 Find the position 4.4 If found delete it I 4.5 Get the substring 4.6 Get the position index 4.7 Perform insertion F 4.8 Get the substring 4.9 Find the position 4.10 Report position o/w 4.11 Display error message 5. Get an edit command
GIT Computer Engineering Department
Bilgisayar Mhendislii Blm
Structure Chart for Text Editor Program
Bilgisayar Mhendislii Blm
GIT Computer Engineering Department
Text Editor Program
Bilgisayar Mhendislii Blm
GIT Computer Engineering Department
Bilgisayar Mhendislii Blm
GIT Computer Engineering Department
Bilgisayar Mhendislii Blm
GIT Computer Engineering Department
Bilgisayar Mhendislii Blm
GIT Computer Engineering Department
Bilgisayar Mhendislii Blm
GIT Computer Engineering Department
Bilgisayar Mhendislii Blm
GIT Computer Engineering Department
Bilgisayar Mhendislii Blm
GIT Computer Engineering Department
scanline Returns Address of Deallocated Space
Bilgisayar Mhendislii Blm
GIT Computer Engineering Department