Upload
ginger-olsen
View
27
Download
3
Embed Size (px)
DESCRIPTION
ECE 264 Object-Oriented Software Development. Instructor: Dr. Honggang Wang Spring 2013 Lecture 14: strings and pointer. Lecture outline. Announcements / reminders Project groups: e-mail Dr. Wang by Thur., March 28 Each group consists of 4-5 students - PowerPoint PPT Presentation
Citation preview
ECE 264Object-Oriented
Software Development
Instructor: Dr. Honggang WangSpring 2013
Lecture 14: strings and pointer
Lecture outline Announcements / reminders
Project groups: e-mail Dr. Wang by Thur., March 28 Each group consists of 4-5 students Those who don’t choose a group will be randomly assigned Can e-mail me with “sub-group”; I’ll fill rest of group
Lab 7 will posted today Today
Review: Arrays & vectors Other container classes Strings Pointer
04/19/23 ECE 264: Lecture 14 2
Review: Arrays Constant size list of items of same type Can initialize using comma-separated list:
int n[] = {10, 20, 30, 40, 50}; Can access individual elements using []
cout << n[1]; would print 20 Can pass arrays to functions
void printArray(int arr[], int size); Pitfalls
Indexing past array boundaries Array name is a pointer passed by reference
04/19/23 ECE 264: Lecture 14 3
Review: Vectors Vectors allow programmer to create “arrays”
that: Are dynamically resizable Can be assigned to one another Can be compared for equality Contain easier generic boundary checking
Can access vectors like arrays: v[0] Can also use vector functions
Examples:vector <double> list; //empty vectorvector<string> wordList(n); //capacity:n strings
//vector of 8 integers, each initialized to 0vector<int> intList(8,0);
04/19/23 ECE 264: Lecture 14 4
Review: Vector methods Common member functions:
bool empty(): true if vector contains no values void pop_back(): deletes last element in vector
Does not actually return the element Gives an error if vector is empty
void push_back(element): add element to end of vector
void resize(int): changes the size of vector size_t size(): returns the size of vector <el> at(<el>): allows you to insert element in
vector, but also provides boundary checking <el>: type of elements stored in the vector (e.g. int, double)
void clear(): removes all elements from vector
04/19/23 ECE 264: Lecture 14 5
Additional container classes C++ standard template library contains other
useful containers list: doubly-linked list
Allows for efficient element insertion Can also push/pop front of list; sort, merge, reverse lists
queue: FIFO queue Has simple push/pop operations
priority_queue: sorted queue with largest element first
stack: LIFO stack Can access top of stack
04/19/23 ECE 264: Lecture 20 6
7
Standard Library Class string
Class string Header <string>, namespace std We’ve seen:
Initialization: string s1( "hi" ); Input/output (as in cout << s1) Assignment: s1 = "hi";
Can also use: Relational operators: ==, !=, >=, >, <=, <
Perform char-by-char comparison using ASCII values Concatenation: +=
E.g.: s1 += “lly” s1 = “hilly”
04/19/23 ECE 264: Lecture 14
Standard Library Class string (Cont.)
Class string (Cont.) Substring member function substr
s1.substr( 0, 14 ); Starts at location 0, gets 14 characters
s1.substr( 15 ); Substring beginning at location 15, to the end
Overloaded [] Access one character No range checking (if subscript invalid)
Member function at Accesses one character
Example s1.at( 10 );
Has bounds checking, throws an exception if subscript is invalid
804/19/23 ECE 264: Lecture 20
Example: Strings & functionsint main(){ string s1( "happy" ); string s2( " birthday" ); string s3;
// test overloaded equality and relational operators cout << "s1 is \"" << s1 << "\"; s2 is \"" << s2 << "\"; s3 is \"" << s3 << '\"' << "\n\nThe results of comparing s2 and s1:" << "\ns2 == s1 yields " << ( s2 == s1 ? "true" : "false" ) << "\ns2 != s1 yields " << ( s2 != s1 ? "true" : "false" ) << "\ns2 > s1 yields " << ( s2 > s1 ? "true" : "false" ) << "\ns2 < s1 yields " << ( s2 < s1 ? "true" : "false" ) << "\ns2 >= s1 yields " << ( s2 >= s1 ? "true" : "false" ) << "\ns2 <= s1 yields " << ( s2 <= s1 ? "true" : "false" );
04/19/23 ECE 264: Lecture 14 9
Example (cont.)
04/19/23 ECE 264: Lecture 14 10
Output from previous slide:
s1 is “happy”; s2 is “ birthday”; s3 is “”
The results of comparing s1 and s2:
s2 == s1 yields false
s2 != s1 yields true
s2 > s1 yields false
s2 < s1 yields true
s2 >= s1 yields false
s2 <= s1 yields true
Example (cont.) // test string member function empty cout << "\n\nTesting s3.empty():" << endl;
if ( s3.empty() ) { cout << "s3 is empty; assigning s1 to s3;" << endl; s3 = s1; // assign s1 to s3 cout << "s3 is \"" << s3 << "\""; } // end if
// test overloaded string concatenation operator cout << "\n\ns1 += s2 yields s1 = "; s1 += s2; // test overloaded concatenation cout << s1;
// test concatenation operator with C-style string cout << "\n\ns1 += \" to you\" yields" << endl; s1 += " to you"; cout << "s1 = " << s1 << "\n\n";
04/19/23 ECE 264: Lecture 14 11
Example (cont.)
04/19/23 ECE 264: Lecture 14 12
Output from previous slide:
Testing s3.empty():
s3 is empty; assigning s1 to s3;
s3 is “happy”
s1 += s2 yields s1 = happy birthday
s1 += “ to you” yields
s1 = happy birthday to you
Example (cont.) // test string member function substr cout << "The substring of s1 starting at location 0 for\n" << "14 characters, s1.substr(0, 14), is:\n" << s1.substr( 0, 14 ) << "\n\n";
// test substr "to-end-of-string" option cout << "The substring of s1 starting at\n" << "location 15, s1.substr(15), is:\n" << s1.substr( 15 ) << endl;
// test using subscript operator to create lvalue s1[ 0 ] = 'H'; s1[ 6 ] = 'B'; cout << "\ns1 after s1[0] = 'H' and s1[6] = 'B' is: " << s1 << "\n\n";
// test subscript out of range with string member function "at" cout << "Attempt to assign 'd' to s1.at( 30 ) yields:" << endl; s1.at( 30 ) = 'd'; // ERROR: subscript out of range return 0;} // end main
04/19/23 ECE 264: Lecture 14 13
Example (cont.)
04/19/23 ECE 264: Lecture 20 14
Output from previous slide:
The substring of s1 starting at location 0 for
14 characters, s1.substr(0, 14), is:
happy birthday
The substring of s1 starting at
location 15, s1.substr(15), is:
to you
s1 after s1[0] = ‘H’ and s1[6] = ‘B’ is: Happy Birthday to you
Attempt to assign ‘d’ to s1.at(30) yields
abnormal program completion
Dynamic memory allocation Up until now, allocated memory statically
Assumed we knew data size at compile time What if data size is input-dependent and
unknown until run time? In C, dynamic memory allocation handled through malloc and free
In C++, we use new and delete
04/19/23 ECE 264: Lecture 14 15
Refresher on pointers Allocators (malloc, new) return pointer to
allocated space Pointer: address of another object
We implicitly use these when we pass function arguments by reference in C++
Can get address of existing object using & Can get value of existing pointer using * Pointer declaration:
<base type>* <pointer name> Base type determines how reference is interpreted Be careful when declaring multiple pointers Be sure to initialize pointer before use
04/19/23 ECE 264: Lecture 14 16
Pointer exampleint *iPtr, i=6;
char* s, str[] = "example";
double *dPtr, d=1.25;
04/19/23 ECE 264: Lecture 14 17
iPtr
s
dPtr
6
"example"
1.25
i
str
d
Pointer assignment The assignment operator (=) is defined for
pointers of the same base type. The right operand of the assignment operator
can be any expression that evaluates to the same type as the left operand.
Example:int x, *xp, *ip;xp = &x;ip = xp;
04/19/23 ECE 264: Lecture 14 18
x
xp
ip
Arrays and pointers Array name is a pointer to first array element
Can use pointers and arrays interchangeably You can use [] to “index” a pointer Example:char myString[] = "This is a string"; char *str;str = myString;for(int i =0; str[i]; i++) //look for null
cout << str[i];
What does this print?
04/19/23 ECE 264: Lecture 14 19
Initialize the Pointer Both define the pointer student and initialize
student to the address of the first element in section:
int section[80];
int *student = section;
Is equivalent toint section[80];
int *student = §ion[0];
The pointer string is initialized to point to the character a in the string "abcd".
char *string = "abcd";
04/19/23 ECE 264: Lecture 14 20
Pointer arithmetic When using pointers/arrays interchangeably, can
make use of pointer arithmetic Can’t change where array name points, but you can
change pointer If p is a pointer, p++ means “point to next element”
“Next element” determined by base type Can compare pointers
p == NULL pointer points nowhere p == q p and q point to same location
Example
int num[4] = {1,2,3,4}, *p;p = num; //same as p = &num[0];cout << *p <<endl;++p;cout << *p;
04/19/23 ECE 264: Lecture 14 21
Practice!
04/19/23 ECE 264: Lecture 14 22
int q=6;int *iPtr = &q;cout << "iPtr is " << iPtr << endl;cout << "*iPtr is " << *iPtr << endl;cout << "++*iPtr, is " << ++*iPtr << endl;cout << "q is " << q << endl;cout << "iPtr is " << iPtr << endl;cout << "*iPtr++ is " << *iPtr++ << endl;cout << "iPtr is " << iPtr << endl;cout << "q is " << q << endl;
Complete the output:iPtr is 0x7fff2f14
04/19/23 ECE 264: Lecture 14 23
Result of Practice
iPtr is 0x7fff2f14*iPtr is 6++*iPtr is 7q is 7iPtr is 0x7fff2f14*iPtr++ is 7iPtr is 0x7fff2f18q is 7
Practice #2char myString[ ] = "This is a string";char *strPtr;strPtr = myString;cout << *myString << endl; cout<<myString << endl; cout << *(myString + 1) << endl;strPtr++;cout << *++strPtr << endl;myString++; //not legal
What does this print?
04/19/23 ECE 264: Lecture 14 24
0xfff4c252strPtr
0xfff4c252
myString T h i s i s a s t r i n g \0
Practice #2 result
04/19/23 ECE 264: Lecture 14 25
T This is a string h i
Common Pointer Problems Using uninitialized pointersint *iPtr;
*iPtr = 100; iPtr has not been initialized. The value 100 will be
assigned to some memory location. Which one determines the error.
Incorrect/unintended syntax.
04/19/23 ECE 264: Lecture 14 26
Example#include <iostream>int main(){ char *aString = "What happens here?"; int len=0; while(*aString++ != '\0')
len++;std::cout << len << ": " << aString;return 0;
}
Does this compile? If not, why? If it does, what is the output? Explain
04/19/23 ECE 264: Lecture 14 27
Final notes Next time
Start dynamic allocation Midterm Survey
Acknowledgements: this lecture borrows heavily from lecture slides provided with the following texts: Deitel & Deitel, C++ How to Program, 8th ed. Etter & Ingber, Engineering Problem Solving with
C++, 2nd ed.
04/19/23 ECE 264: Lecture 14 28