Transcript Strings
CS 162
Introduction to Computer Science
Chapter 17
C++ String Objects
Herbert G. Mayer, PSU
(Copied from Prof. Phillip Wong at PSU)
Status 11/30/2014
Syllabus
String Data
Simple String Operations
Examples
String I/O Functions
String Library Functions
String to Number Conversion
Arrays of Strings
String Data
C++ lacks the built-in type string
Strings are approximated in C++ via arrays of
characters, i.e. arrays of type char
Declaration: char stringname[ SIZE ];
Characters in the string occupy consecutive char
elements in the array
2
The first '\0' (null) character found in a string literal
marks the end of the string. It must be present for
literals, inserted by your C++ compiler
When declaring a string, the array size should also be
long enough to hold both the string and '\0’
Declaring a character array larger than the expected
string length allows the array to accommodate a
larger string at a later time
3
Example:
// Declare two strings
char str1[ 4 ];
char str2[ 10 ];
// Initialize string one char at a time
str1[0]= 'C'; str1[1]= 'a'; str1[2]= 't';
str1[3]= '\0';
// Use up only 5 out of 10 elements
str2[0]= 'J'; str2[1]= 'a'; str2[2]= 'n';
str2[3]= 'e'; str2[4]= '\0';
4
A string literal, A.K.A. constant is delimited by
double quotation marks (e.g., "Hello, world!”)
A literal string automatically has a '\0' at the end of
the string
A string variable can be declared and initialized with
a string literal
Example:
char
char
char
char
s[10] =
mystr[]
t1[4] =
t2[3] =
"Hi, Bob!";
= " Good night everybody! ”;
"Jim"; // OK
"Jim"; // ERROR! Overflow
5
Example:
char s[10] = "Hi, Bob!";
s[0] s[1] s[2] s[3] s[4] s[5] s[6] s[7] s[8] s[9]
s → 'H' 'i' ',' ' ' 'B' 'o' 'b' '!'
s[0] 'H'
1218
s[1] 'i'
1219
s[2] ','
1220
s[3] ' '
1221
s[4] 'B'
1222
s[5] 'o'
1223
s[6] 'b'
1224
s[7] '!'
1225
s[8] '\0'
1226
s[9]
1227
'\0'
s is the address of the first character in the string.
s[j] is the j-th character in the string.
s is equivalent to &s[0].
Declared array size
Valid array index range
= 10
= 0 .. 9
6
Example:
char s[10] = "Hi, Bob!";
s[0] s[1] s[2] s[3] s[4] s[5] s[6] s[7] s[8] s[9]
s → 'H' 'i' ',' ' ' 'B' 'o' 'b' '!'
'\0'
What happens if we do this: s[6] = '\0'; ?
s[0] s[1] s[2] s[3] s[4] s[5] s[6] s[7] s[8] s[9]
s → 'H' 'i' ',' ' ' 'B' 'o'
'\0' '!' '\0'
The string stored in s is now “Hi, Bo” instead of
“Hi, Bob!”
7
To embed a quote " in a string, use \"
Example:
char str1[] = "Hello";
char str2[] = "\"Hello\"";
/* Hello */
/* "Hello" */
To embed a backslash in a string, use \\
Example:
char winpath[]="C:\\Windows”; // C:\Windows
8
Examples of Simple String Operations
Assume these string declarations:
char str1[ MAXSIZE ], str2[ MAXSIZE ];
Input a string (requires stdio.h)
fgets( str1, MAXSIZE, stdin );
Stores input in str1.
Print a string
printf( "str1 = %s\n", str1 );
Copy a string (requires string.h)
strcpy( str1, "Hello” ); Copies literal “Hello” to str1.
strcpy( str2, str1 );
Copies contents of str1 to str2.
9
Example:
/* Simple string operations demonstration */
#include <stdio.h>
#include <string.h>
#define MAXLEN 100
int main( void )
{ // main
char str1[ MAXLEN ], str2[ MAXLEN ];
printf( "What is your name? ” );
fgets( str1, MAXLEN, stdin );
printf( "Hello, %s!\n", str1 );
return 0;
} //end main
Output:
What is your name? Joe
Hello, Joe
!
Why does the exclamation point
show up on a separate line?
fgets() stores the newline
('\n') that you typed as part of
the string itself.
10
String I/O Functions
C has library functions to input and output strings
Use #include <stdio.h>
In the following table, char * is a pointer to a
character array
String I/O Functions
int printf( const char * fmt, … )
Prints formatted output to console
int sprintf( char * s, const char * fmt, … )
Prints formatted output to string s
int puts( const char * s )
Prints string to console
int scanf( const char * fmt, … )
Reads formatted input from console
int fgets( const char * s, FILE * stream )
Reads string from input stream
11
printf()
int printf( const char * format, …);
Writes formatted output to the console:
Use the %s format specifier for strings
%s expects the address of a char array which contains a string
Example:
char name[] = "Jane Doe";
printf("[%s]\n", name );
→ [Jane Doe]
printf("[%s]\n", & name[0] ); → [Jane Doe]
printf("[%s]\n", & name[5] ); → [Doe]
12
sprintf()
int sprintf( char * s, const char * format, …);
Performs a formatted print and saves it into a string
Works like printf except the output is stored in string s
Nothing is printed to the console
Example:
char str[50];
int x = 4;
sprintf( str, "x=%d y=%f", x, 1.5f );
printf( "title = %s\n", str );
title = x=4 y=1.500000
<- and line feed
13
puts()
int puts( const char * s );
Writes a string to the console
A newline '\n' is automatically printed at the end of the string
Example:
char name[] = "Jane Doe";
puts( name );
printf( "lives here.\n” );
Output:
Jane Doe
lives here.
14
scanf()
int scanf( const char * format, …);
Reads formatted input from the console
Use the %s format specifier for strings
%s expects the address of a char array
Only reads single “words” at a time (whitespace delimited)
Example:
char str[100];
/* String storage */
scanf( "%s", str ); /* str is address */
scanf( "%s", &str[0] ); // synonymous to str
15
scanf()
scanf skips whitespace( space, tab, newline) and then stores
in str all characters up to the next whitespace
scanf automatically adds '\0' to the end of the array
It does not check for char array overflow. The array must be
large enough to hold the expected string and the '\0’
Any unused text remains in the input stream
Example:
scanf( "%s", str1 );
User types in: Hello, Portland !!!
scanf( "%s", str2 );
→ str1 holds Hello,
→ str2 holds Portland
// not the !!!
16
fgets()
char * fgets( char * s, int m, FILE * stream );
Reads a string from the input stream
For input from the console, use stdin for the stream
fgets reads input characters until one of these conditions is met:
m – 1 characters are read
'\n' (newline) is read, will be stored if fits into space
End-of-file is detected
If successful, returns pointer to s
If end-of-file, returns NULL pointer
17
Example
#define MAXLEN 10000
char str[ MAXLEN ];
// String storage
if( fgets( str, MAXLEN, stdin ) ) {
printf( "%s", str );
}else{
printf( "End of file\n” );
} //end if
18
If a newline is entered to signal the end of input, the '\n'
character is also stored as part of string
fgets automatically terminates the string with '\0’
Example:
fgets( str, 10, stdin );
Suppose the user types in: Jim May
str
→
User types
Enter key
(newline)
'J' 'i' 'm' ' ' 'M' 'a' 'y' '\n' '\0'
printf( "[%s]", str );
]
→
[Jim May
19
Is there a simple way to get rid of the extraneous '\n' when
using fgets?
This is one approach that works:
fgets( s, MAXLEN, stdin );
if( strchr( s,'\n') != NULL )
s[ strlen(s) - 1 ] = '\0';
Caveat: The if check is necessary because a Ctrl-D terminates
input without adding an extra '\n’
Warning: There is also a function; gets(). DO NOT USE IT!!
gets() does not check for char array overflow
20
String Library Functions
C has a library of string processing functions
Use #include <string.h>
In the following table:
s is of type char * (pointer to char array)
n is of type size_t (unsigned integer)
cs and ct are of type const char *
c is an int converted to char
21
Some Common string lib functions
size_t strlen( cs )
return length of cs.
char * strcpy( s, ct )
copy string ct to string s, including ‘\0’; return s.
char * strncpy( s, ct, n )
copy at most n characters of string ct to s; return s. Pad
with ‘\0’s if ct has fewer than n characters.
char * strcat( s, ct )
concatenate string ct to end of string s; return s.
char * strncat( s, ct, n )
concatenate at most n characters of string ct to string s,
terminate s with ‘\0’; return s.
int strcmp( cs, ct )
compare string cs to string ct; return <0 if cs<ct;
0 if cs==ct, or >0 if cs>ct.
int strncmp( cs, ct, n )
compare at most n characters of string cs to string ct;
return <0 if cs<ct; 0 if cs==ct, or >0 if cs>ct.
char * strchr( cs, c )
return pointer to first occurrence of c in cs or NULL if not
present
char * strrchr( cs, c )
return pointer to last occurrence of c in cs or NULL if not
present
char * strstr( cs, ct )
return pointer to first occurrence of string ct in cs, or NULL
if not present
22
strlen()
size_t strlen( const char * s );
Determines the length of the string s.
The function counts the number of characters in the array.
The count starts at array index 0.
It continues counting until the first '\0' is found.
('\0' itself is not included in the string length.)
Example:
strlen("") → 0
char x[] = "Cat"; strlen(x) → 3
SL = strlen(" PSU Vikings") → 12
23
strcpy()
char * strcpy( char * d, const char * s );
Copies contents of string s to string d
The terminating '\0' is also copied to d.
The contents of d are overwritten.
The address of string d is returned.
Strings cannot be copied using the = assignment operator. Use
strcpy() instead.
Example:
char dst[20], src[] = "Hello";
strcpy( dst, "Siri” );
→ dst holds Siri
strcpy( dst, src );
→ dst holds Hello
24
strcat()
char * strcat( char * d, const char * s );
Concatenates contents of string s to string d
The contents of s are appended to the end of whatever is
already in d
The original '\0' in d is deleted before appending happens
The address of the new string d is returned
Strings cannot be concatenated using the + operator in C.
Use strcat() instead.
Example:
char dst[20] = "PSU", src[] = " rocks!";
strcat( dst, src ); → dst holds PSU rocks!
25
strcmp()
int strcmp( const char * s, const char * t );
Compares contents of string s to string t
s and t are compared character by character
Returns zero (0) if the strings are identical
positive number if s is lexically greater than t
negative number if t is lexically greater than s
Strings cannot be compared using a relational operator. Use
strcmp() instead
Example:
char s1[5] = "PSU", s2[10] = "OSU";
strcmp( s1, s2 );
→ returns 1
strcmp( s2, s1 );
→ returns -1
26
Example:
char a[10], b[10];
/* Two strings */
strcpy(
strcpy(
strcat(
strcat(
/*
/*
/*
/*
a,
b,
a,
b,
"Star” );
a );
" Trek” );
" Wars” );
a:
b:
a:
b:
Star
Star
Star
Star
*/
*/
Trek */
Wars */
if( strlen(a) > 0 && strlen(b) > 0 )
if( strcmp( a, b ) == 0 )
printf( "You're kidding, right?\n” );
else if( strcmp( a, b ) < 0 )
printf( "Trekker!\n” );
27
strchr()
char * strchr( const char * s, int c );
Finds position of character c within string s.
If c is found, returns pointer to first occurrence of c in s.
If c is not found, returns NULL pointer.
Example:
char s[] = "PSU OSU";
strchr( s, 'A’ );
→ returns NULL
p = strchr( s, 'U’ ); → returns pointer to first U
28
strchr()
char * strstr( const char * s, const char * t
);
Finds position of string t within string s.
If t is found, returns pointer to first occurrence of t in s.
If t is not found, returns NULL pointer.
Example:
char s[] = "PSU OSU";
strstr( s, "A" );
→ returns NULL
p = strstr( s, "U O" ); → returns ptr to location
29
String to Number Conversion
Use #include <stdlib.h>
Conversion functions (partial list)
double atof( const char * s )
Converts s to a number of type double
int atoi( const char * s )
Converts s to a number of type int
long atol( const char * s )
Converts s to a number of type long int
Example:
double x;
char numstr[] = "12.75 HI";
x = atof( numstr ); → x contains 12.75
x = atof( "HI 12.75” ); → x contains 0.0
printf( "%d\n", atoi( numstr ) ); → displays 12
30
Array of Strings
An array of strings (“string array”) is a 2-D array
Each row represents a separate string
When declaring the array, the number of columns
must be large enough to hold the largest expected
string
An individual string within the array can be accessed
by using just the row index
31
Example:
/* 4 strings of up to 10 chars each */
char s[4][10];
strcpy( s[0], "Doe, Jane” );
strcpy( s[3], "Rand, Bob” );
/* Assume user enters: Li, Joe */
fgets( s[1], 10, stdin );
/* Assume user enters:
scanf( "%s", s[2] );
Li, Joe */
printf( "%s\n", s[0] );
printf( "%s\n", &s[0][5] );
printf( "%c\n", s[3][6] );
/* Doe, Jane */
/* Jane */
/* B */
32
Example: (continued from previous page)
0
1
2
3
4
5
6
7
8
9
s[0]
→
'D' 'o' 'e' ',' ' ' 'J' 'a' 'n' 'e' '\0'
length = 9
s[1]
→
'L' 'i' ',' ' ' 'J' 'o' 'e' '\n' '\0'
length = 8
s[2]
→
'L' 'i' ',' '\0'
length = 3
s[3]
→
'R' 'a' 'n' 'd' ',' ' ' 'B'
o'
'b' '\0'
length = 9
s is the name for the entire array of strings.
s[i] is the address of the i-th string in the array.
s[i][j] is j-th character of the i-th string.
s[i] is equivalent to &s[i][0].
33
Example: Write a string length function using arrays
#include <stdio.h>
/* Function returns the length of a string */
int str_len( const char s[])
{ // str_len
int k = 0; /* Array index for string */
while( s[k] != '\0') /* Look for string terminator */
k++;
return k; /* k is also the length */
} //end str_len
int main( void )
{ // main
char a[] = "Hello!";
printf( "String length is %d.\n", str_len(a) );
return 0;
} //end main
34
Example: Write a string copy function using arrays
/* String copy: source: cs thus can be const, destination: st */
char * str_cpy( char st[], const char cs[] )
{
int k = 0; // Array index for string
while( cs[k] != '\0’ ) { /* Look for string terminator */
st[k] = cs[k]; /* Copy single character at a time */
k++;
} //end while
st[k] = '\0'; /* Add string terminator to destination */
return st; // st by itself is an address
} //end str_cpy
35