programming design c strings
TRANSCRIPT
![Page 1: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/1.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 1 / 105
Programming Design
C Strings
Ling-Chieh Kung
Department of Information Management
National Taiwan University
Characters C strings C string processing functions
![Page 2: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/2.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 2 / 105
Outline
• Characters
• C strings
• C string processing functions
Characters C strings C string processing functions
![Page 3: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/3.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 3 / 105
char
• charmeans a character.
– Use one byte (–128 to 127) to store English letters, numbers, symbols, and
special characters (e.g, the newline character).
– Cannot store, e.g, Chinese characters.
• It is also an integer!
– These characters are encoded with the ASCII code in most PCs.
Characters C strings C string processing functions
![Page 4: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/4.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 4 / 105
char
• Character literals should be
placed in between a pair of single
quotation marks.
int main()
{
char c = '0';
cout << static_cast<int>(c) << " ";
c = 'A';
cout << static_cast<int>(c) << " ";
c = '\n';
cout << static_cast<int>(c) << " ";
return 0;
}
• A char variable can also be assigned
and compared with integer values.
int main()
{
char c = 48;
cout << c << " ";
c += 10;
cout << c << " ";
if(c > 50)
cout << c << " ";
return 0;
}
Characters C strings C string processing functions
![Page 5: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/5.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 5 / 105
Example 1: confirming an operation
• We may let a user enter a character to
confirm the execution of some
operations.
– If ‘Y’ or ‘y’, execute.
– Otherwise, do not execute.
int main()
{
int a = 0, b = 0;
char c = 0;
do
{
cout << "Enter two integers: ";
cin >> a >> b;
cout << "Add? ";
cin >> c;
} while(c != 'Y' && c != 'y');
cout << a + b << "\n";
return 0;
}
Characters C strings C string processing functions
![Page 6: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/6.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 6 / 105
Example 2: detecting target characters
• Sometimes we want to activate
some actions upon receiving a set
of target characters.
– For example, we may want to
turn all capital letters into its
lowercase.
– 26 if-elseworks.
– Is there a better way?
• Knowing the ASCII code helps (a
lot):
#include <iostream>
using namespace std;
int main()
{
char c = 0;
while(cin >> c)
{
if(65 <= c && c <= 90)
cout << static_cast<char>(c + 32);
else
cout << c;
cout << "\n";
}
return 0;
}
Characters C strings C string processing functions
![Page 7: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/7.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 7 / 105
Example 2: detecting target characters
• Example 2 works, but is not very good.
– One needs to know the ASCII code to write or understand the program.
– What if the ASCII code is changed some day?
• The C++ standard library <cctype> contains some useful functions for
processing characters.
Function header Result
int islower(int c); Returning 0 if c is not lowercase; nonzero otherwise
int isupper(int c); Returning 0 if c is not uppercase; nonzero otherwise
int tolower(int c); Returning the ASCII code of the lowercase of c
int toupper(int c); Returning the ASCII code of the uppercase of c
Characters C strings C string processing functions
![Page 8: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/8.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 8 / 105
Example 2: detecting target characters
• By using tolower(): #include <iostream>
#include <cctype>
using namespace std;
int main()
{
char c = 0;
while(cin >> c)
cout << static_cast<char>(tolower(c)) << "\n";
return 0;
}
Characters C strings C string processing functions
![Page 9: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/9.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 9 / 105
Character processing functions
• There are many other useful functions.
• Question: Why not return bool? Why int?
Function header Return value
int isalpha(int c); 0 if c is not a letter; nonzero otherwise
int isdigit(int c); 0 if c is not a digit; nonzero otherwise
int isalnum(int c); 0 if c is neither a letter nor a digit; nonzero otherwise
int isprint(int c); 0 if c is not printable; nonzero otherwise
int isspace(int c); 0 if c is not a space; nonzero otherwise
int ispunct(int c); 0 if c is not a punctuation mark; nonzero otherwise
Characters C strings C string processing functions
![Page 10: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/10.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 10 / 105
Example 3: ASCII code table
• Let’s print out the ASCII code table
for printable characters:
#include <iostream>
#include <iomanip>
#include <cctype>
using namespace std;
int main()
{
cout << " 0123456789\n";
for(int i = 30; i <= 126; i++)
{
if(i % 10 == 0)
cout << setw(2) << i / 10 << " ";
if(isprint(i))
cout << static_cast<char>(i);
else
cout << " ";
if(i % 10 == 9)
cout << "\n";
}
return 0;
}
Characters C strings C string processing functions
![Page 11: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/11.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 11 / 105
Outline
• Characters
• C strings
• C String processing functions
Characters C strings C string processing functions
![Page 12: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/12.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 12 / 105
String literals
• In many applications, we need some ways to handle strings.
• E.g., in an address book application, if we do not have strings:
– We cannot store names.
– We cannot store phone numbers.
– We cannot store addresses.
• Strings can be implemented in two ways:
– C strings as character arrays.
– C++ strings as objects.
• Let’s introduce C strings today.
Characters C strings C string processing functions
![Page 13: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/13.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 13 / 105
String
• We have already used a string with cout:
– "Hello world" is a string.
• A string literal is contained in a pair of double quotation marks.
• A C string (variable) is declared as a character array.
– char s[10];
• A character array can be initialized as a usual array.
– char s[10] = {0};
– char s[10] = {'a', 'b', 'c'};
cout << "Hello world";
Characters C strings C string processing functions
![Page 14: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/14.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 14 / 105
Example: entering a string until #
• Consider the following program:
– Let a user enter a string ending with a # symbol.
– Then print out the string (excluding #).
• The character array is simply used as
a usual array.
#include <iostream>
using namespace std;
const int LEN = 10;
int main()
{
char s[LEN] = {0};
int n = 0;
do
{
cin >> s[n];
n++;
} while(s[n - 1] != '#' && n < LEN);
for(int i = 0; i < n - 1; i++)
cout << s[i];
return 0;
}
Characters C strings C string processing functions
![Page 15: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/15.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 15 / 105
A special way to input a string
• Because they are used for string, character arrays are special.
– Many operations are overloaded for character arrays in a special way.
– In particular, cin >> and cout <<.
• For an array A, if we do cin >> A:
– If A is of other types, this is not allowed.
– But for a character array, this allows us to input the string.
char str[10];
cin >> str; // if we type "abcde"
cout << str[0]; // a
cout << str[2]; // c
Characters C strings C string processing functions
![Page 16: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/16.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 16 / 105
A special way to output a string
• For an array A, if we do cout << A:
– If A is of other types, this will print out it memory address.
– But for a character array, this prints out the whole string (some exceptions
will be discussed later).
• But wait… How does the cout << operation know when to stop?
– Why not printing out ten characters?
– Or does it print out ten characters but we do not see it?
int values[5] = {0};
cout << values; // an address
char str[10];
cin >> str; // if we type "abcde"
cout << str; // abcde
Characters C strings C string processing functions
![Page 17: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/17.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 17 / 105
The null character
• When we use cin >> to input a string, a null character \0will be appended at
the end automatically.
– \0 is an escape sequence. It marks the end of a string.
– Its ASCII code is 0.
– It is \0, not \o or \O.
• When you declare a character array of length n, you can store a string of length
at most n – 1.
• A C string may be initialized with a double quotation.
– char s[100] = "abc";
– The assignment operator is overloaded for character arrays.
– A null character will also be appended if a C string is initialized in this way.
Characters C strings C string processing functions
![Page 18: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/18.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 18 / 105
Understanding the null character
• From the system’s perspective, a null character marks the end of a string.
– In particular, << is implemented to print out characters up to \0.
• Recall that one may also initialize a C string by assigning multiple characters.
– char s[100] = {'a', 'b', 'c'};
– No null character will be appended (though uninitialized values will be
initialized to 0, which is the null character).
– = is overloaded for “a C string” and “some characters” in different ways.
char a[100] = "abcde FGH";
cout << a << "\n";// abcde FGH
char b[100] = "abcde\0FGH";
cout << b << "\n"; // abcde
Characters C strings C string processing functions
abcde FGH
abcde
a cba d e F G H \0
cba d e \0 F G Hb \0
![Page 19: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/19.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 19 / 105
Comparisons
• We have two ways to initialize a C string:
• We have two ways to input a C string:
Example Will a null character be appended?
char s[10] = "abc"; Yes
char s[100] = {'a', 'b', 'c'}; No
Example Will a null character be appended?
cin >> s; Yes
cin >> s[0]; No
Characters C strings C string processing functions
![Page 20: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/20.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 20 / 105
Example: entering a string until \n
• Consider the following program:
– Let a user enter a string ending with a \n symbol.
– Then print out the string (excluding \n).
• The character array is used with overloaded cin >>
and cout <<.
#include <iostream>
using namespace std;
const int LEN = 10;
int main()
{
char s[LEN] = {0};
cin >> s;
cout << s << "\n";
return 0;
}
Characters C strings C string processing functions
![Page 21: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/21.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 21 / 105
String assignments
• Assignments with double quotations are allowed only for initialization.
– After all, s stores a memory address.
• One may assign values to a string by assigning values to individual characters.
char s[100];
s = "this is a string"; // compilation error!
s[0] = 'A';
s[1] = 'B';
s[2] = 'C';
Characters C strings C string processing functions
![Page 22: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/22.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 22 / 105
String assignments
• How to explain the outputs of this program?
char c[100] = {0};
cin >> c; // "123456789"
cin >> c; // "abcde";
cout << c << "\n"; // "abcde"
c[5] = '*';
cout << c << "\n"; // "abcde*789"
Characters C strings C string processing functions
21c 3 4 5 6 7 8 9 \0
00c 0 0 0 0 0 … … 0
bac c d e \0 7 8 9 \0
bac c d e * 7 8 9 \0
(1)
(2)
(3)
(4)
(1)
(2)
(3)
(4)
![Page 23: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/23.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 23 / 105
Array boundary
• C++ does not check array boundary!
• We may or may not touch those memory spaces used by other
programs/variables.
– If a protected space is touched, an error occurs and our program is shutdown.
– If not, cout << prints out the whole string until the end of a string, which
is marked by a \0.
char a[5] = {0};
cin >> a; // "123456789"
cout << a; // "123456789" or an error
Characters C strings C string processing functions
![Page 24: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/24.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 24 / 105
A strange case
• Is it because that a white space is treated as an end of C strings?
• No!
• Then why?
char a1[100] = {0};
cin >> a1; // "this is a string"
cout << a1; // "this"
char a2[100] = {'a', 'b', ' ', 'c', '\0', 'e'};
cout << a2; // ab c
Characters C strings C string processing functions
![Page 25: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/25.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 25 / 105
cin >> vs. cin.getline()
• cin >> splits the input stream into
pieces according to white spaces.
– The same thing happens for the
newline character and tab.
• To input a string with white spaces, use cin.getline().
– A instance function of the object cin (to be introduced later in this
semester).
– It splits the input stream according
to newline characters only.
– A null character is appended.
char a[100];
cin.getline(a, 100); // Hi, it's me
cout << a << "\n"; // Hi, it's me
char a[100] = {0};
char b[100] = {0};
cin >> a >> b; // this is
cout << a << "\n"; // this
cout << b << "\n"; // is
Characters C strings C string processing functions
![Page 26: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/26.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 26 / 105
Example: counting the number of spaces
• Several strings are contained in a text file.
– Each string is put in one line.
– Each string has at most 100 characters.
• For each input string, we want to count the
number of spaces in it (which is the number
of words minus one in some applications).
• Challenges:
– If consecutive spaces are considered as
only one space, how to count the number?
– What if cin.getline(a, 100) is
replaced by cin >> a?
char a[100] = {0};
while(cin.getline(a, 100))
{
int i = 0;
int spaceCount = 0;
while(a[i] != '\0')
{
if(a[i] == ' ')
spaceCount++;
i++;
}
cout << spaceCount << "\n";
}
Characters C strings C string processing functions
![Page 27: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/27.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 27 / 105
String arrays
• A character array represents a string.
• A two-dimensional character array represents a set of strings.
– This may also be called a string array.
– Each one-dimensional array is a C string (with a \0 at the end).
char name[4][10] = {"John", "Mikasa", "Eren", "Armin"};
cout << name << "\n"; // an address
cout << name[1] << "\n";
cin >> name[2];
cout << name[2][0] << "\n";
Characters C strings C string processing functions
hoJ n \0name
kiM a s a \0
erE n \0
mrA i n \0
![Page 28: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/28.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 28 / 105
C strings as character pointers
• Recall that a pointer may point to an array.
• Therefore, a character pointer may also represent a C string.
• More interestingly:
char s[100] = "12345";
char* p = s;
cout << p << "\n";
cin >> p; // or s
cout << s; // or p
char s[100] = "12345";
char* p = s;
cout << p + 2 << "\n";
Characters C strings C string processing functions
321 4 5s
p
(1)(1)
(2)
(2)
![Page 29: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/29.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 29 / 105
A pointer is not an array
• Still, a pointer is not an array.
– In particular, no space has been allocated to
store values.
• When we use a character pointer as a C string:
– We may write values into an array through
the pointer.
– We cannot write values if there is no space
allocated.
• Just like usual arrays and pointers:
char* p;
cin >> p; // run-time error!
cout << sizeof(a); // 100
cout << sizeof(p); // 8
Characters C strings C string processing functions
![Page 30: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/30.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 30 / 105
String literals and character pointers
• A character pointer may also be initialized as a string literal.
– When we do so, the system allocates space storing “12345”.
– That space is read-only.
– p stores the address of that space.
char* p = "12345";
cout << p + 2 << "\n"; // 345
Characters C strings C string processing functions
321 4 5
p
![Page 31: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/31.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 31 / 105
String literals and character pointers
• In fact, one may assign a string literal to a character pointer at any time.
– What will happen is the same as assigning the string literal at initialization.
• Note that the pointer now points to a different (read-only) place:
char a[100] = "12345";
char* p = a;
p = "abc"; // does not affect a
cout << p << "\n"; // abc
cout << a << "\n"; // 12345
char a[100] = {0};
a = "123"; // compilation error
char* p;
p = "abc"; // okay
char a[100] = "12345";
char* p = a;
p = "abc";
cout << p << "\n";
cin >> p; // run-time error
Characters C strings C string processing functions
![Page 32: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/32.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 32 / 105
Passing a string to a function
• To pass a string to a function, let the parameter type be a character pointer or a
character array. Then pass an address to it.
#include <iostream>
#include <cstring>
using namespace std;
void reverse(char p[]);
void print(char* p);
int main()
{
char s[100] = "12345";
reverse(&s[1]);
print(s);
return 0;
}
void reverse(char p[])
{
int n = strlen(p);
char* temp = new char[n];
for(int i = 0; i < n; i++)
temp[i] = p[n - i - 1];
for(int i = 0; i < n; i++)
p[i] = temp[i];
delete [] temp;
}
void print(char* p)
{
cout << p << "\n";
}
Characters C strings C string processing functions
![Page 33: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/33.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 33 / 105
Main function arguments
• In fact, we may pass arguments to the main function.
– argv[0] is the name of the executable file.
– argv[i] is the ith string passed into main.
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
for(int i = 0; i < argc; i++)
cout << argv[i] << "\n";
return 0;
}
Characters C strings C string processing functions
![Page 34: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/34.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 34 / 105
Main function arguments
• To pass a string, add it behind the execution statement.
Characters C strings C string processing functions
![Page 35: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/35.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 35 / 105
A dynamic character arrays as a C string
• A dynamic character array (pointed by a pointer) can store a C string.
• Be careful when you use dynamic arrays:
char* p = new char[100];
cin >> p;
cout << p << "\n";
p = "123"; // memory leak
cout << p;
delete [] p; // run-time error
char* p = new char[100];
cin >> p;
cout << p;
delete p;
Characters C strings C string processing functions
![Page 36: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/36.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 36 / 105
Outline
• Characters
• C strings
• C string processing functions
Characters C strings C string processing functions
![Page 37: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/37.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 37 / 105
C String processing functions
• The C++ standard library <cstring> contains many useful pointer-based
string processing functions.
– Query and searching strlen, strchr, strstr.
– Comparison: strcmp, strncmp.
– Concatenation: strcat, strncat.
– Copying: strcpy, strncpy.
– Splitting: strtok.
• The C++ standard library <cstdlib> contains some more.
– String-number conversion: atoi, atof, itoa.
• Look for detailed explanations by yourselves!
– For example, at http://www.cplusplus.com/.
Characters C strings C string processing functions
![Page 38: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/38.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 38 / 105
String length query
• The function strlen returns the string length of a given C string.
– It returns the number of characters between str and the first ‘\0’.
– It accepts a string literal, a character pointer, and a static character array.
char* p = new char[100];
cin >> p;
cout << strlen(p);
p[3] = '\0';
cout << strlen(p + 1);
delete [] p;
unsigned int strlen(const char* str);
char* p = "12345";
cout << strlen(p) << "\n";
char a[100] = "1234567";
cout << strlen(a) << "\n";
Characters C strings C string processing functions
![Page 39: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/39.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 39 / 105
String length query
• Note the difference between strlen and sizeof!
– strlen(p) returns 5 because the length of the string pointed by p is 5.
– strlen(a) returns 10 because the length of the string contained in a is 10.
– sizeof(a) return 100 because that is the size of a.
– sizeof(a + 2) returns 8. why?
char* p = "12345";
cout << strlen(p) << "\n";
char a[100] = "1234567890";
cout << strlen(a) << "\n";
cout << sizeof(a) << "\n";
cout << sizeof(a + 2) << "\n";
Characters C strings C string processing functions
![Page 40: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/40.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 40 / 105
Example: counting the number of spaces
• Recall that we want to count the number of spaces in a given string.
• With strlen, we may do this better.
char a[100] = {0};
while(cin.getline(a, 100))
{
int spaceCount = 0;
for(int i = 0; i < strlen(a); i++)
{
if(a[i] == ' ')
spaceCount++;
}
cout << spaceCount << "\n";
}
Characters C strings C string processing functions
![Page 41: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/41.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 41 / 105
Searching in a string
• To find the location of a character in a string (or conclude that it does not exist in the string), use strchr.
• It returns the address of the first occurrence of the character.
– If the character does not exist, it returns nullptr.
char* strchr(char* str, int character);
char a[100] = "1234567890";
char* p = strchr(a, '8');
if(strchr(a, 'a') == nullptr)
cout << "!!!\n";
cout << strchr(a, '4') << "\n";
cout << strchr(a, '4') - a;
Characters C strings C string processing functions
![Page 42: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/42.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 42 / 105
Searching for the next occurrence
• Two advanced techniques:
– The returned address may be used to modify the given string.
– The returned address may be used as the starting location of a “new string”
to search for the next occurrence of the character.
• The following program replaces all white spaces to underlines.
char a[100] = "this is a book";
char* p = strchr(a, ' ');
while(p != nullptr)
{
*p = '_';
p = strchr(p, ' '); // why p?
}
cout << a;
Characters C strings C string processing functions
![Page 43: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/43.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 43 / 105
Searching for the next occurrence
char a[100] = "this is a book";
char* p = strchr(a, ' ');
while(p != nullptr)
{
*p = '_';
p = strchr(p, ' '); // why p?
}
cout << a;
Characters C strings C string processing functions
iht s i s a b o o ka
![Page 44: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/44.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 44 / 105
Searching for the next occurrence
char a[100] = "this is a book";
char* p = strchr(a, ' ');
while(p != nullptr)
{
*p = '_';
p = strchr(p, ' '); // why p?
}
cout << a;
Characters C strings C string processing functions
iht s i s a b o o ka
p
![Page 45: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/45.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 45 / 105
Searching for the next occurrence
char a[100] = "this is a book";
char* p = strchr(a, ' ');
while(p != nullptr)
{
*p = '_';
p = strchr(p, ' '); // why p?
}
cout << a;
Characters C strings C string processing functions
iht s i s a b o o ka _
p
![Page 46: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/46.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 46 / 105
Searching for the next occurrence
char a[100] = "this is a book";
char* p = strchr(a, ' ');
while(p != nullptr)
{
*p = '_';
p = strchr(p, ' '); // why p?
}
cout << a;
Characters C strings C string processing functions
iht s _ i s a b o o ka
p
_
![Page 47: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/47.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 47 / 105
Searching for the next occurrence
char a[100] = "this is a book";
char* p = strchr(a, ' ');
while(p != nullptr)
{
*p = '_';
p = strchr(p, ' '); // why p?
}
cout << a;
Characters C strings C string processing functions
iht s _ i s _ a b o o ka
p
_
![Page 48: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/48.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 48 / 105
Searching for a substring
• If we want to search for a substring, we use strstr.
– This returns the address of the first occurrence of str2 in str1.
char a[100] = "this is a book";
char* p = strstr(a, "is");
while(p != nullptr)
{
*p = 'I'; // not p = "IS"!
*(p + 1) = 'S';
p = strstr(p, "is");
}
cout << a;
char* strstr(char* str1, const char* str2);
Characters C strings C string processing functions
![Page 49: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/49.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 49 / 105
Searching for a substring
char a[100] = "this is a book";
char* p = strstr(a, "is");
while(p != nullptr)
{
*p = 'I'; // not p = "IS"!
*(p + 1) = 'S';
p = strstr(p, "is");
}
cout << a;
Characters C strings C string processing functions
iht s i s a b o o ka
![Page 50: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/50.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 50 / 105
Searching for a substring
char a[100] = "this is a book";
char* p = strstr(a, "is");
while(p != nullptr)
{
*p = 'I'; // not p = "IS"!
*(p + 1) = 'S';
p = strstr(p, "is");
}
cout << a;
Characters C strings C string processing functions
iht s i s a b o o ka
p
![Page 51: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/51.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 51 / 105
Searching for a substring
char a[100] = "this is a book";
char* p = strstr(a, "is");
while(p != nullptr)
{
*p = 'I'; // not p = "IS"!
*(p + 1) = 'S';
p = strstr(p, "is");
}
cout << a;
Characters C strings C string processing functions
iht s i s a b o o ka I
p
![Page 52: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/52.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 52 / 105
Searching for a substring
char a[100] = "this is a book";
char* p = strstr(a, "is");
while(p != nullptr)
{
*p = 'I'; // not p = "IS"!
*(p + 1) = 'S';
p = strstr(p, "is");
}
cout << a;
Characters C strings C string processing functions
iht s i s a b o o ka I S
p
![Page 53: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/53.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 53 / 105
Searching for a substring
char a[100] = "this is a book";
char* p = strstr(a, "is");
while(p != nullptr)
{
*p = 'I'; // not p = "IS"!
*(p + 1) = 'S';
p = strstr(p, "is");
}
cout << a;
Characters C strings C string processing functions
iht s i s a b o o ka I S
p
![Page 54: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/54.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 54 / 105
Searching for a substring
char a[100] = "this is a book";
char* p = strstr(a, "is");
while(p != nullptr)
{
*p = 'I'; // not p = "IS"!
*(p + 1) = 'S';
p = strstr(p, "is");
}
cout << a;
Characters C strings C string processing functions
iht s i s a b o o ka I S I
p
![Page 55: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/55.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 55 / 105
Searching for a substring
char a[100] = "this is a book";
char* p = strstr(a, "is");
while(p != nullptr)
{
*p = 'I'; // not p = "IS"!
*(p + 1) = 'S';
p = strstr(p, "is");
}
cout << a;
Characters C strings C string processing functions
iht s i s a b o o ka I S I S
p
![Page 56: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/56.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 56 / 105
String-number conversion
• In <cstdlib>, two functions converts a character array into a number:
– For atoi, str should contain only digits (but the first character can be ‘-’).
– For atof, strmay contain at most one ‘.’.
• A function converts a number into a character array:
int atoi(const char* str);
double atof(const char* str);
char a[100] = "1234";
cout << atoi(a) * 2 << "\n";
char b[100] = "-12.34";
cout << atof(b) / 2 << "\n";
Characters C strings C string processing functions
char* itoa(int value, char* str, int base); char a[100] = {0};
itoa(123, a, 2);
cout << a << "\n";
itoa(123, a, 10);
cout << a[2] << " " << a << "\n";
![Page 57: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/57.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 57 / 105
String comparisons
• Strings may also be compared alphabetically (consider your dictionaries!).
• We may use strcmp and strncmp to compare two strings.
– They returns 0 if the two strings are identical, a negative number if str1 is
in front of str2, and a positive number if str2 is in front of str1.
– strcmp compares the entire strings. strncmp does up to num characters.
int strcmp (const char* str1, const char* str2);
int strncmp(const char* str1, const char* str2, unsigned int num);
Characters C strings C string processing functions
char a[100] = "the";
char b[100] = "they";
char c[100] = "them";
cout << strcmp(a, b) << "\n";
cout << strcmp(b, c) << " " << strncmp(b, c, 2);
![Page 58: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/58.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 58 / 105
String copying
• In the previous example, replacing a substring in a string requires multiple
character modifications.
• We may do it at once with strcpy.
– It copies the string at source into the array at dest, including the
terminating null character in source. It returns dest.
char* strcpy(char* dest, const char* source);
char a[100] = "watermelon";
char b[100] = "orange";
cout << a << "\n";
strcpy(a, b);
cout << a << "\n";
char a[100] = "watermelon";
char b[100] = "orange";
cout << a << "\n";
strcpy(a, b);
cout << a + 7 << "\n"; // ?
Characters C strings C string processing functions
![Page 59: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/59.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 59 / 105
String copying
char a[100] = "watermelon";
char b[100] = "orange";
cout << a << "\n";
strcpy(a, b);
cout << a << "\n";
char a[100] = "watermelon";
char b[100] = "orange";
cout << a << "\n";
strcpy(a, b);
cout << a + 7 << "\n"; // ?
Characters C strings C string processing functions
taw e r m e l o na \0
aro n g eb \0
aro n g e \0 l o na \0
aro n g eb \0
(1)
(2)
(1)
(2)
(3)
(3)
![Page 60: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/60.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 60 / 105
String copying
• Let’s modify the previous program:
• It does not work! Why? How to fix it?
char a[100] = "this is a book";
char* p = strstr(a, "is");
while(p != nullptr)
{
strcpy(p, "IS");
p = strstr(p, "is");
}
cout << a;
Characters C strings C string processing functions
![Page 61: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/61.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 61 / 105
String copying
• Let’s modify the previous program:
char a[100] = "this is a book";
char* p = strstr(a, "is");
while(p != nullptr)
{
strcpy(p, "IS");
p = strstr(p, "is");
}
cout << a;
Characters C strings C string processing functions
iht s i s a b o o ka
p
![Page 62: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/62.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 62 / 105
String copying
• Let’s modify the previous program:
char a[100] = "this is a book";
char* p = strstr(a, "is");
while(p != nullptr)
{
strcpy(p, "IS");
p = strstr(p, "is");
}
cout << a;
Characters C strings C string processing functions
iht s i s a b o o ka
p
I S \0
![Page 63: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/63.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 63 / 105
String concatenation
• A similar task is to concatenate two strings. We may use strcat to do this.
– This copies source to the end of dest. The \0 of dest is replaced by the
first character of source. The \0 of source is also copied. It returns dest.
char* strcat(char* dest, const char* source);
char a[100] = "watermelon";
char b[100] = "orange";
cout << a << "\n";
strcat(a, b);
cout << a << "\n";
Characters C strings C string processing functions
taw e r m e l o na \0
aro n g eb \0
![Page 64: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/64.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 64 / 105
String concatenation
• A similar task is to concatenate two strings. We may use strcat to do this.
– This copies source to the end of dest. The \0 of dest is replaced by the
first character of source. The \0 of source is also copied. It returns dest.
char* strcat(char* dest, const char* source);
char a[100] = "watermelon";
char b[100] = "orange";
cout << a << "\n";
strcat(a, b);
cout << a << "\n";
Characters C strings C string processing functions
aro n g eb \0
taw e r m e l o na \0 aro n g e \0
![Page 65: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/65.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 65 / 105
Preparing enough space
• strcpy and strcatmodifies the destination array.
• A programmer must make sure that there is enough space of the modification.
• The destination must be an array (static or dynamic), not just a pointer.
char a[15] = "watermelon";
char b[100] = "orange";
cout << a << "\n";
strcat(a, b); // dangerous!
cout << a << "\n";
char* a;
char b[100] = "orange";
strcat(a, b); // dangerous!
Characters C strings C string processing functions
![Page 66: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/66.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 66 / 105
Preparing enough space
• To help prevent run-time error, two additional versions are provided:
– If source has at most num characters, only the first num characters in
source are copied. No \0 is copied into dest.
– If source has fewer than num characters, \0will be padded so that in total
num characters are copied.
char* strncpy(char* dest, const char* source, unsigned int num);
char* strncat(char* dest, const char* source, unsigned int num);
char a[15] = "watermelon";
char b[100] = "orange";
strncat(a, b, sizeof(a) - strlen(a) - 1);
cout << a << "\n";
Characters C strings C string processing functions
![Page 67: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/67.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 67 / 105
Example: sorting names alphabetically
• Given a set of names, let’s sort them alphabetically.
• For example:
– Before: (John, Mikasa, Eren, Armin).
– After: (Armin, Eren, John, Mikasa).
• Strategy:
– We may implement, e.g., bubble sort.
– To compare two names, we use strcmp.
– When we want to swap two names, we use strcpy.
Characters C strings C string processing functions
![Page 68: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/68.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 68 / 105
Example: sorting names alphabetically
#include <iostream>
#include <cstring>
using namespace std;
const int CNT = 4;
const int LEN = 10;
void swapName(char* n1, char* n2)
{
char temp[LEN] = {0};
strcpy(temp, n1);
strcpy(n1, n2);
strcpy(n2, temp);
}
int main()
{
char name[CNT][LEN]
= {"John", "Mikasa", "Eren", "Armin"};
for(int i = 0; i < CNT; i++)
for(int j = 0; j < CNT - i - 1; j++)
if(strcmp(name[j], name[j + 1]) > 0)
swapName(name[j], name[j + 1]);
for(int i = 0; i < CNT; i++)
cout << name[i] << " ";
return 0;
}
Characters C strings C string processing functions
![Page 69: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/69.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 69 / 105
Example: sorting names alphabetically
char name[CNT][LEN]
= {"John", "Mikasa", "Eren", "Armin"};
for(int i = 0; i < CNT; i++)
for(int j = 0; j < CNT - i - 1; j++)
if(strcmp(name[j], name[j + 1]) > 0)
swapName(name[j], name[j + 1]);
Characters C strings C string processing functions
hoJ n \0name[0]
kiM a s a \0
erE n \0
mrA i n \0
name[1]
name[2]
name[3]
i = 0, j = 0
![Page 70: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/70.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 70 / 105
Example: sorting names alphabetically
char name[CNT][LEN]
= {"John", "Mikasa", "Eren", "Armin"};
for(int i = 0; i < CNT; i++)
for(int j = 0; j < CNT - i - 1; j++)
if(strcmp(name[j], name[j + 1]) > 0)
swapName(name[j], name[j + 1]);
Characters C strings C string processing functions
hoJ n \0name[0]
kiM a s a \0
erE n \0
mrA i n \0
name[1]
name[2]
name[3]
i = 0, j = 1
![Page 71: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/71.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 71 / 105
Example: sorting names alphabetically
#include <iostream>
#include <cstring>
using namespace std;
const int CNT = 4;
const int LEN = 10;
void swapName(char* n1, char* n2)
{
char temp[LEN] = {0};
strcpy(temp, n1);
strcpy(n1, n2);
strcpy(n2, temp);
}
Characters C strings C string processing functions
swapName(name[1], name[2]);
kiM a s a \0
erE n \0
name[1]
name[2]
temp
![Page 72: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/72.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 72 / 105
Example: sorting names alphabetically
#include <iostream>
#include <cstring>
using namespace std;
const int CNT = 4;
const int LEN = 10;
void swapName(char* n1, char* n2)
{
char temp[LEN] = {0};
strcpy(temp, n1);
strcpy(n1, n2);
strcpy(n2, temp);
}
Characters C strings C string processing functions
swapName(name[1], name[2]);
kiM a s a \0
erE n \0
name[1]
name[2]
kiM a s a \0temp
![Page 73: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/73.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 73 / 105
Example: sorting names alphabetically
#include <iostream>
#include <cstring>
using namespace std;
const int CNT = 4;
const int LEN = 10;
void swapName(char* n1, char* n2)
{
char temp[LEN] = {0};
strcpy(temp, n1);
strcpy(n1, n2);
strcpy(n2, temp);
}
Characters C strings C string processing functions
swapName(name[1], name[2]);
erE n \0 a \0
erE n \0
name[1]
name[2]
kiM a s a \0temp
![Page 74: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/74.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 74 / 105
Example: sorting names alphabetically
#include <iostream>
#include <cstring>
using namespace std;
const int CNT = 4;
const int LEN = 10;
void swapName(char* n1, char* n2)
{
char temp[LEN] = {0};
strcpy(temp, n1);
strcpy(n1, n2);
strcpy(n2, temp);
}
Characters C strings C string processing functions
swapName(name[1], name[2]);
erE n \0 a \0
kiM a s a \0
name[1]
name[2]
kiM a s a \0temp
![Page 75: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/75.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 75 / 105
Example: sorting names alphabetically
char name[CNT][LEN]
= {"John", "Mikasa", "Eren", "Armin"};
for(int i = 0; i < CNT; i++)
for(int j = 0; j < CNT - i - 1; j++)
if(strcmp(name[j], name[j + 1]) > 0)
swapName(name[j], name[j + 1]);
Characters C strings C string processing functions
hoJ n \0name[0]
erE n \0 a \0
kiM a s a \0
mrA i n \0
name[1]
name[2]
name[3]
i = 0, j = 1
![Page 76: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/76.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 76 / 105
Example: sorting names alphabetically
char name[CNT][LEN]
= {"John", "Mikasa", "Eren", "Armin"};
for(int i = 0; i < CNT; i++)
for(int j = 0; j < CNT - i - 1; j++)
if(strcmp(name[j], name[j + 1]) > 0)
swapName(name[j], name[j + 1]);
Characters C strings C string processing functions
hoJ n \0name[0]
erE n \0 a \0
kiM a s a \0
mrA i n \0
name[1]
name[2]
name[3]
i = 0, j = 2
![Page 77: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/77.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 77 / 105
Example: sorting names alphabetically
char name[CNT][LEN]
= {"John", "Mikasa", "Eren", "Armin"};
for(int i = 0; i < CNT; i++)
for(int j = 0; j < CNT - i - 1; j++)
if(strcmp(name[j], name[j + 1]) > 0)
swapName(name[j], name[j + 1]);
Characters C strings C string processing functions
hoJ n \0name[0]
erE n \0 a \0
mrA i n \0 \0
kiM a s a \0
name[1]
name[2]
name[3]
i = 0, j = 2
![Page 78: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/78.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 78 / 105
Example: sorting names alphabetically
char name[CNT][LEN]
= {"John", "Mikasa", "Eren", "Armin"};
for(int i = 0; i < CNT; i++)
for(int j = 0; j < CNT - i - 1; j++)
if(strcmp(name[j], name[j + 1]) > 0)
swapName(name[j], name[j + 1]);
Characters C strings C string processing functions
hoJ n \0name[0]
erE n \0 a \0
mrA i n \0 \0
kiM a s a \0
name[1]
name[2]
name[3]
i = 1, j = 0
![Page 79: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/79.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 79 / 105
Example: sorting names alphabetically
char name[CNT][LEN]
= {"John", "Mikasa", "Eren", "Armin"};
for(int i = 0; i < CNT; i++)
for(int j = 0; j < CNT - i - 1; j++)
if(strcmp(name[j], name[j + 1]) > 0)
swapName(name[j], name[j + 1]);
Characters C strings C string processing functions
erE n \0name[0]
hoJ n \0
mrA i n \0 \0
kiM a s a \0
name[1]
name[2]
name[3]
i = 1, j = 0
![Page 80: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/80.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 80 / 105
Example: sorting names alphabetically
char name[CNT][LEN]
= {"John", "Mikasa", "Eren", "Armin"};
for(int i = 0; i < CNT; i++)
for(int j = 0; j < CNT - i - 1; j++)
if(strcmp(name[j], name[j + 1]) > 0)
swapName(name[j], name[j + 1]);
Characters C strings C string processing functions
erE n \0name[0]
hoJ n \0
mrA i n \0 \0
kiM a s a \0
name[1]
name[2]
name[3]
i = 1, j = 1
![Page 81: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/81.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 81 / 105
Example: sorting names alphabetically
char name[CNT][LEN]
= {"John", "Mikasa", "Eren", "Armin"};
for(int i = 0; i < CNT; i++)
for(int j = 0; j < CNT - i - 1; j++)
if(strcmp(name[j], name[j + 1]) > 0)
swapName(name[j], name[j + 1]);
Characters C strings C string processing functions
erE n \0name[0]
mrA i n \0
hoJ n \0
kiM a s a \0
name[1]
name[2]
name[3]
i = 1, j = 1
![Page 82: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/82.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 82 / 105
Example: sorting names alphabetically
char name[CNT][LEN]
= {"John", "Mikasa", "Eren", "Armin"};
for(int i = 0; i < CNT; i++)
for(int j = 0; j < CNT - i - 1; j++)
if(strcmp(name[j], name[j + 1]) > 0)
swapName(name[j], name[j + 1]);
Characters C strings C string processing functions
erE n \0name[0]
mrA i n \0
hoJ n \0
kiM a s a \0
name[1]
name[2]
name[3]
i = 2, j = 0
![Page 83: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/83.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 83 / 105
Example: sorting names alphabetically
char name[CNT][LEN]
= {"John", "Mikasa", "Eren", "Armin"};
for(int i = 0; i < CNT; i++)
for(int j = 0; j < CNT - i - 1; j++)
if(strcmp(name[j], name[j + 1]) > 0)
swapName(name[j], name[j + 1]);
Characters C strings C string processing functions
mrA i n \0name[0]
erE n \0
hoJ n \0
kiM a s a \0
name[1]
name[2]
name[3]
i = 2, j = 0
![Page 84: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/84.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 84 / 105
Example: sorting names alphabetically
• That implementation works, but may be improved.
– A lot of strcpymakes the implementation inefficient.
– Let’s swap pointers instead.
• Strategy:
– Create pointers pointing to names.
– When we find that two names should be swapped, we swap the
corresponding pointers, i.e., exchanging the addresses contained in them.
Characters C strings C string processing functions
![Page 85: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/85.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 85 / 105
• Why calling by reference?
• Is namemodified?
Example: sorting names alphabetically
#include <iostream>
#include <cstring>
using namespace std;
const int CNT = 4;
const int LEN = 10;
void swapPtr(char*& p1, char*& p2)
{
char* temp = p1;
p1 = p2;
p2 = temp;
}
int main()
{
char name[CNT][LEN]
= {"John", "Mikasa", "Eren", "Armin"};
char* ptr[CNT]
= {name[0], name[1], name[2], name[3]};
for(int i = 0; i < CNT; i++)
for(int j = 0; j < CNT - i - 1; j++)
if(strcmp(ptr[j], ptr[j + 1]) > 0)
swapPtr(ptr[j], ptr[j + 1]);
for(int i = 0; i < CNT; i++)
cout << ptr[i] << " ";
return 0;
}
Characters C strings C string processing functions
![Page 86: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/86.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 86 / 105
Example: sorting names alphabetically
char name[CNT][LEN]
= {"John", "Mikasa", "Eren", "Armin"};
char* ptr[CNT]
= {name[0], name[1], name[2], name[3]};
Characters C strings C string processing functions
hoJ n \0name[0]ptr[0]
kiM a s a \0name[1]ptr[1]
erE n \0name[2]ptr[2]
mrA i n \0name[3]ptr[3]
![Page 87: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/87.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 87 / 105
Example: sorting names alphabetically
Characters C strings C string processing functions
hoJ n \0name[0]ptr[0]
kiM a s a \0name[1]ptr[1]
erE n \0name[2]ptr[2]
mrA i n \0name[3]ptr[3]
i = 0, j = 0
for(int i = 0; i < CNT; i++)
for(int j = 0; j < CNT - i - 1; j++)
if(strcmp(ptr[j], ptr[j + 1]) > 0)
swapPtr(ptr[j], ptr[j + 1]);
![Page 88: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/88.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 88 / 105
Example: sorting names alphabetically
Characters C strings C string processing functions
hoJ n \0name[0]ptr[0]
kiM a s a \0name[1]ptr[1]
erE n \0name[2]ptr[2]
mrA i n \0name[3]ptr[3]
i = 0, j = 1
for(int i = 0; i < CNT; i++)
for(int j = 0; j < CNT - i - 1; j++)
if(strcmp(ptr[j], ptr[j + 1]) > 0)
swapPtr(ptr[j], ptr[j + 1]);
![Page 89: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/89.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 89 / 105
Example: sorting names alphabetically
Characters C strings C string processing functions
hoJ n \0name[0]ptr[0]
kiM a s a \0name[1]ptr[1]
erE n \0name[2]ptr[2]
mrA i n \0name[3]ptr[3]
void swapPtr(char*& p1, char*& p2)
{
char* temp = p1;
p1 = p2;
p2 = temp;
}
swapPtr(ptr[1], ptr[2]);
temp
![Page 90: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/90.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 90 / 105
Example: sorting names alphabetically
Characters C strings C string processing functions
hoJ n \0name[0]ptr[0]
kiM a s a \0name[1]ptr[1]
erE n \0name[2]ptr[2]
mrA i n \0name[3]ptr[3]
void swapPtr(char*& p1, char*& p2)
{
char* temp = p1;
p1 = p2;
p2 = temp;
}
swapPtr(ptr[1], ptr[2]);
temp
![Page 91: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/91.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 91 / 105
Example: sorting names alphabetically
Characters C strings C string processing functions
hoJ n \0name[0]ptr[0]
kiM a s a \0name[1]ptr[1]
erE n \0name[2]ptr[2]
mrA i n \0name[3]ptr[3]
void swapPtr(char*& p1, char*& p2)
{
char* temp = p1;
p1 = p2;
p2 = temp;
}
swapPtr(ptr[1], ptr[2]);
temp
![Page 92: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/92.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 92 / 105
Example: sorting names alphabetically
Characters C strings C string processing functions
hoJ n \0name[0]ptr[0]
kiM a s a \0name[1]ptr[1]
erE n \0name[2]ptr[2]
mrA i n \0name[3]ptr[3]
i = 0, j = 1
for(int i = 0; i < CNT; i++)
for(int j = 0; j < CNT - i - 1; j++)
if(strcmp(ptr[j], ptr[j + 1]) > 0)
swapPtr(ptr[j], ptr[j + 1]);
![Page 93: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/93.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 93 / 105
Example: sorting names alphabetically
Characters C strings C string processing functions
hoJ n \0name[0]ptr[0]
kiM a s a \0name[1]ptr[1]
erE n \0name[2]ptr[2]
mrA i n \0name[3]ptr[3]
i = 0, j = 2
for(int i = 0; i < CNT; i++)
for(int j = 0; j < CNT - i - 1; j++)
if(strcmp(ptr[j], ptr[j + 1]) > 0)
swapPtr(ptr[j], ptr[j + 1]);
![Page 94: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/94.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 94 / 105
Example: sorting names alphabetically
Characters C strings C strings processing functions
hoJ n \0name[0]ptr[0]
kiM a s a \0name[1]ptr[1]
erE n \0name[2]ptr[2]
mrA i n \0name[3]ptr[3]
i = 0, j = 2
for(int i = 0; i < CNT; i++)
for(int j = 0; j < CNT - i - 1; j++)
if(strcmp(ptr[j], ptr[j + 1]) > 0)
swapPtr(ptr[j], ptr[j + 1]);
![Page 95: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/95.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 95 / 105
Example: sorting names alphabetically
Characters C strings C string processing functions
hoJ n \0name[0]ptr[0]
kiM a s a \0name[1]ptr[1]
erE n \0name[2]ptr[2]
mrA i n \0name[3]ptr[3]
i = 1, j = 0
for(int i = 0; i < CNT; i++)
for(int j = 0; j < CNT - i - 1; j++)
if(strcmp(ptr[j], ptr[j + 1]) > 0)
swapPtr(ptr[j], ptr[j + 1]);
![Page 96: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/96.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 96 / 105
Example: sorting names alphabetically
Characters C strings C string processing functions
hoJ n \0name[0]ptr[0]
kiM a s a \0name[1]ptr[1]
erE n \0name[2]ptr[2]
mrA i n \0name[3]ptr[3]
i = 1, j = 0
for(int i = 0; i < CNT; i++)
for(int j = 0; j < CNT - i - 1; j++)
if(strcmp(ptr[j], ptr[j + 1]) > 0)
swapPtr(ptr[j], ptr[j + 1]);
![Page 97: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/97.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 97 / 105
Example: sorting names alphabetically
Characters C strings C string processing functions
hoJ n \0name[0]ptr[0]
kiM a s a \0name[1]ptr[1]
erE n \0name[2]ptr[2]
mrA i n \0name[3]ptr[3]
i = 1, j = 1
for(int i = 0; i < CNT; i++)
for(int j = 0; j < CNT - i - 1; j++)
if(strcmp(ptr[j], ptr[j + 1]) > 0)
swapPtr(ptr[j], ptr[j + 1]);
![Page 98: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/98.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 98 / 105
Example: sorting names alphabetically
Characters C strings C string processing functions
hoJ n \0name[0]ptr[0]
kiM a s a \0name[1]ptr[1]
erE n \0name[2]ptr[2]
mrA i n \0name[3]ptr[3]
i = 1, j = 1
for(int i = 0; i < CNT; i++)
for(int j = 0; j < CNT - i - 1; j++)
if(strcmp(ptr[j], ptr[j + 1]) > 0)
swapPtr(ptr[j], ptr[j + 1]);
![Page 99: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/99.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 99 / 105
Example: sorting names alphabetically
Characters C strings C string processing functions
hoJ n \0name[0]ptr[0]
kiM a s a \0name[1]ptr[1]
erE n \0name[2]ptr[2]
mrA i n \0name[3]ptr[3]
i = 2, j = 0
for(int i = 0; i < CNT; i++)
for(int j = 0; j < CNT - i - 1; j++)
if(strcmp(ptr[j], ptr[j + 1]) > 0)
swapPtr(ptr[j], ptr[j + 1]);
![Page 100: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/100.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 100 / 105
Example: sorting names alphabetically
Characters C strings C string processing functions
hoJ n \0name[0]ptr[0]
kiM a s a \0name[1]ptr[1]
erE n \0name[2]ptr[2]
mrA i n \0name[3]ptr[3]
i = 2, j = 0
for(int i = 0; i < CNT; i++)
for(int j = 0; j < CNT - i - 1; j++)
if(strcmp(ptr[j], ptr[j + 1]) > 0)
swapPtr(ptr[j], ptr[j + 1]);
![Page 101: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/101.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 101 / 105
Splitting a string into substrings
• We often want to split a string into substrings based on some characters.
– E.g., to split a sentence into words based on spaces and punctuation marks.
– E.g., to split a comma-separated row into attributes based on commas.
– These characters are called delimiters. These substrings are called tokens.
• Let’s write a program that split an URL into tokens based on ‘.’ and ‘/’.
– Input: www.im.ntu.edu.tw/~lckung/courses/PD16
– Output: www im ntu edu tw ~lckung courses PD16
• We may implement this by using strchr.
– A better way is to use strtok.
char* strtok(char* str, const char* delimiters );
Characters C strings C string processing functions
![Page 102: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/102.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 102 / 105
Example: splitting an URL
#include <iostream>
#include <cstring>
using namespace std;
const int CNT = 100;
const int WORD_LEN = 50;
const int SEN_LEN = 1000;
int main()
{
char url[SEN_LEN];
char delim[] = ".\\";
char word[CNT][WORD_LEN] = {0};
int wordCnt = 0;
cin >> url;
char* start = strtok(url, delim);
while(start != nullptr)
{
strcpy(word[wordCnt], start);
wordCnt++;
start = strtok(nullptr, delim);
}
for(int i = 0; i < wordCnt; i++)
cout << word[i] << " ";
return 0;
}
Characters C strings C string processing functions
![Page 103: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/103.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 103 / 105
Splitting a string into substrings
• The function strtok is special.
• At the first invocation (assuming the first character is not a delimiter):
– str is the beginning of the string to be split, and delimiters is a character
array containing delimiter characters.
– The first delimiter will be found and replaced by \0.
– The returned pointer stores the address of the first token (which is str).
– The location of the first non-delimiter character right after the first delimiter
is recorded internally in the function for future uses.
char* strtok(char* str, const char* delimiters );
Characters C strings C string processing functions
![Page 104: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/104.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 104 / 105
Splitting a string into substrings
• The function strtok is special.
• At subsequent invocations:
– str should be nullptr.
– The internally recorded starting location is automatically used as the
starting point.
– The next delimiter is replaced by \0.
– The returned pointer stores the address of the current token (which is that
starting location internally stored before this invocation).
char* strtok(char* str, const char* delimiters );
Characters C strings C string processing functions
![Page 105: Programming Design C Strings](https://reader030.vdocuments.mx/reader030/viewer/2022012713/61ac4ac3d53549295b66b3a4/html5/thumbnails/105.jpg)
Ling-Chieh Kung (NTU IM)Programming Design – C strings 105 / 105
Visualization of string splitting
Characters C strings C string processing functions
.mi n t u . e d u . t w / ~ l c k u n g \0
\0mi n t u . e d u . t w / ~ l c k u n g \0
\0mi n t u \0 e d u . t w / ~ l c k u n g \0
\0mi n t u \0 e d u \0 t w / ~ l c k u n g \0
\0mi n t u \0 e d u \0 t w \0 ~ l c k u n g \0
\0mi n t u \0 e d u \0 t w \0 ~ l c k u n g \0