cs107, lecture 4 - stanford universitycs107, lecture 4 c strings reading: k&r (1.9, 5.5,...

124
1 This document is copyright (C) Stanford Computer Science and Nick Troccoli, licensed under Creative Commons Attribution 2.5 License. All rights reserved. Based on slides created by Marty Stepp, Cynthia Lee, Chris Gregg, and others. CS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3

Upload: others

Post on 19-Sep-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

1This document is copyright (C) Stanford Computer Science and Nick Troccoli, licensed under Creative Commons Attribution 2.5 License. All rights reserved.

Based on slides created by Marty Stepp, Cynthia Lee, Chris Gregg, and others.

CS107, Lecture 4C Strings

Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3

Page 2: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

2

Plan For Today• Characters• Strings• Common String Operations• Comparing• Copying• Concatenating• Substrings

• Break: Announcements• Practice: Diamond• More String Operations: Searching and Spans

Page 3: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

3

Plan For Today• Characters• Strings• Common String Operations• Comparing• Copying• Concatenating• Substrings

• Break: Announcements• Practice: Diamond• More String Operations: Searching and Spans• Practice: Password Verification

Page 4: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

4

CharA char is a variable type that represents a single character or “glyph”.

char letterA = 'A';char plus = '+';char zero = '0';char space = ' ';char newLine = '\n';char tab = '\t';char singleQuote = '\'';char backSlash = '\\';

Page 5: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

5

ASCIIUnder the hood, C represents each char as an integer (its “ASCII value”).

• Uppercase letters are sequentially numbered• Lowercase letters are sequentially numbered• Digits are sequentially numbered• Lowercase letters are 32 more than their uppercase equivalents

char uppercaseA = 'A'; // Actually 65char lowercaseA = 'a'; // Actually 97char zeroDigit = '0’; // Actually 48

Page 6: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

6

ASCIIWe can take advantage of C representing each char as an integer:

bool areEqual = 'A' == 'A'; // truebool earlierLetter = 'f' < 'c'; // falsechar uppercaseB = 'A' + 1;int diff = 'c' - 'a'; // 2int numLettersInAlphabet = 'z' – 'a' + 1;// orint numLettersInAlphabet = 'Z' – 'A' + 1;

Page 7: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

7

ASCIIWe can take advantage of C representing each char as an integer:

// prints out every lowercase characterfor (char ch = 'a'; ch <= 'z'; ch++) {

printf("%c", ch);}

Page 8: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

8

Common ctype.h FunctionsFunction Description

isalpha(ch) true if ch is 'a' through 'z' or 'A' through 'Z'

islower(ch) true if ch is 'a' through 'z'

isupper(ch) true if ch is 'A' through 'Z'

isspace(ch) true if ch is a space, tab, new line, etc.

isdigit(ch) true if ch is '0' through '9'

toupper(ch) returns uppercase equivalent of a letter

tolower(ch) returns lowercase equivalent of a letter

Remember: these return the new char, they cannot modify an existing char!

Page 9: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

9

Common ctype.h Functionsbool isLetter = isalpha('A'); // truebool capital = isupper('f'); // falsechar uppercaseB = toupper('b');bool digit = isdigit('4'); // true

Page 10: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

10

Plan For Today• Characters• Strings• Common String Operations• Comparing• Copying• Concatenating• Substrings

• Break: Announcements• Practice: Diamond• More String Operations: Searching and Spans

Page 11: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

11

C StringsC has no dedicated variable type for strings. Instead, a string is represented as an array of characters.

char text[] = "Hello, world!";

• Each character is assigned an index, going from 0 to length-1• There is a char at each index

index 0 1 2 3 4 5 6 7 8 9 10 11 12character 'H' 'e' 'l' 'l' 'o' ',' ' ' 'w' 'o' 'r' 'l' 'd' '!'

Page 12: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

12

Creating Stringschar myString[] = "Hello, world!";char empty[] = "";

myString[0] = 'h';printf("%s", myString); // hello, world!

char stringToFillIn[30];stringToFillIn[0] = 'a';...

Page 13: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

13

Creating StringsIf you do not need to modify the string later, you can use this shorthand:

char *myString = "Hello, world!";char *empty = "";

myString[0] = 'h’; // crashes!printf("%s", myString); // Hello, world!

Page 14: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

14

C Stringschar myString[]

vschar *myString

Both are essentially pointers to the first character in the string. However, you cannot reassign an array after you create it. You can reassign a pointer after you create it.

char myString[] = "Hello, world!";myString = "Another string"; // not allowed!---char *myString = "Hello, world!";myString = "Another string"; // ok

Page 15: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

15

String LengthC strings are just arrays of characters. How do we determine string length?Option 1: reserve the first byte to store the length

index ? 0 1 2 3 4 5 6 7 8 9 10 11 12value 13 'H' 'e' 'l' 'l' 'o' ',' ' ' 'w' 'o' 'r' 'l' 'd' '!'

Pros Cons• Can get length in O(1) time! • Length is limited by size of 1

byte, and longer lengths need more bytes.

• Must compensate for indices (index 0 is length)

Page 16: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

16

String LengthC strings are just arrays of characters. How do we determine string length?Option 2: terminate every string with a '\0’ character.

index 0 1 2 3 4 5 6 7 8 9 10 11 12 13value 'H' 'e' 'l' 'l' 'o' ',' ' ' 'w' 'o' 'r' 'l' 'd' '!' '\0'

Pros Cons• Always uses exactly 1 extra

byte.• Doesn’t change indices of

other characters.

• Requires traversing the string to calculate its length.

Page 17: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

17

String LengthC strings use Option 2 – they are arrays of characters, ending with a null-terminating character '\0’.

Use the provided strlen function to calculate string length. The null-terminating character does not count towards the length.

char *myStr = "Hello, world!";int length = strlen(myStr); // 13

Caution: strlen is O(N) because it must scan the entire string! Save the value if you plan to refer to the length later.

index 0 1 2 3 4 5 6 7 8 9 10 11 12 13value 'H' 'e' 'l' 'l' 'o' ',' ' ' 'w' 'o' 'r' 'l' 'd' '!' '\0'

Page 18: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

18

C Strings As ParametersRegardless of how you created the string, when you pass a string as a parameter it is always passed as a char *.

int doSomething(char *str) {…

}

char *myString = "Hello";doSomething(myString);

Page 19: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

19

C Strings As ParametersRegardless of how you created the string, when you pass a string as a parameter it is always passed as a char *.

int doSomething(char *str) {…

}

char myString[] = "Hello";doSomething(myString);

Page 20: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

20

Plan For Today• Characters• Strings• Common String Operations• Comparing• Copying• Concatenating• Substrings

• Break: Announcements• Practice: Diamond• More String Operations: Searching and Spans

Page 21: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

21

Common string.h FunctionsFunction Description

strlen(str) returns the # of chars in a C string (before null-terminating character).strcmp(str1, str2), strncmp(str1, str2, n)

compares two strings; returns 0 if identical, <0 if str1 comes before str2 in alphabet, >0 if str1 comes after str2 in alphabet. strncmpstops comparing after at most n characters.

strchr(str, ch)strrchr(str, ch)

character search: returns a pointer to the first occurrence of ch in str, or NULL if ch was not found in str. strrchr find the last occurrence.

strstr(haystack, needle) string search: returns a pointer to the start of the first occurrence of needle in haystack, or NULL if needle was not found in haystack.

strcpy(dst, src),strncpy(dst, src, n)

copies characters in src to dst, including null-terminating character. Assumes enough space in dst. Strings must not overlap. strncpystops after at most n chars, and does not add null-terminating char.

strcat(dst, src),strncat(dst, src, n)

concatenate src onto the end of dst. strncat stops concatenating after at most n characters. Always adds a null-terminating character.

strspn(str, accept),strcspn(str, reject)

strspn returns the length of the initial part of str which contains onlycharacters in accept. strcspn returns the length of the initial part of str which does not contain any characters in reject.

Page 22: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

22

Comparing StringsYou cannot compare C strings using comparison operators like ==, < or >. This compares character addresses!

char *str1 = "hello"; // e.g. 0x7f42char *str2 = "world"; // e.g. 0x654dif (str1 > str2) { … // compares 0x7f42 > 0x654d!

Instead, use strcmp:int compResult = strcmp(str1, str2);if (compResult == 0) {

// equal} else if (compResult < 0) {

// str1 comes before str2 } else {

// str1 comes after str2}

Page 23: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

23

Copying StringsYou cannot copy C strings using =. This copies character addresses!

char str1[] = "hello"; // e.g. 0x7f42char *str2 = str1; // 0x7f42. Points to same string!str2[0] = 'H';printf("%s", str1); // Helloprintf("%s", str2); // Hello

Instead, use strcpy:

char str1[] = "hello"; // e.g. 0x7f42char str2[6];strcpy(str2, str1);str2[0] = 'H';printf("%s", str1); // helloprintf("%s", str2); // Hello

Page 24: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

24

Copying Stringschar str1[] = "hello";char str2[6];strcpy(str2, str1);

0 1 2 3 4 5'h' 'e' 'l' 'l' 'o' '\0'str1

0 1 2 3 4 5? ? ? ? ? ?str2

Page 25: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

25

Copying Stringschar str1[] = "hello";char str2[6];strcpy(str2, str1);

str1

0 1 2 3 4 5'h' ? ? ? ? ?str2

0 1 2 3 4 5'h' 'e' 'l' 'l' 'o' '\0'

Page 26: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

26

Copying Stringschar str1[] = "hello";char str2[6];strcpy(str2, str1);

str1

0 1 2 3 4 5'h' 'e' ? ? ? ?str2

0 1 2 3 4 5'h' 'e' 'l' 'l' 'o' '\0'

Page 27: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

27

Copying Stringschar str1[] = "hello";char str2[6];strcpy(str2, str1);

str1

0 1 2 3 4 5'h' 'e' 'l' ? ? ?str2

0 1 2 3 4 5'h' 'e' 'l' 'l' 'o' '\0'

Page 28: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

28

Copying Stringschar str1[] = "hello";char str2[6];strcpy(str2, str1);

str1

0 1 2 3 4 5'h' 'e' 'l' 'l' ? ?str2

0 1 2 3 4 5'h' 'e' 'l' 'l' 'o' '\0'

Page 29: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

29

Copying Stringschar str1[] = "hello";char str2[6];strcpy(str2, str1);

str1

0 1 2 3 4 5'h' 'e' 'l' 'l' 'o' ?str2

0 1 2 3 4 5'h' 'e' 'l' 'l' 'o' '\0'

Page 30: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

30

Copying Stringschar str1[] = "hello";char str2[6];strcpy(str2, str1);

str1

0 1 2 3 4 5'h' 'e' 'l' 'l' 'o' '\0'str2

0 1 2 3 4 5'h' 'e' 'l' 'l' 'o' '\0'

Page 31: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

31

Copying Stringschar str1[] = "hello";char str2[6];strcpy(str2, str1);

str1

0 1 2 3 4 5'h' 'e' 'l' 'l' 'o' '\0'str2

0 1 2 3 4 5'h' 'e' 'l' 'l' 'o' '\0'

Page 32: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

32

Copying StringsYou are responsible for ensuring there is enough space in the destination to hold the entire copy, including the null-terminating character.

char str1[] = "hello, world!";char str2[6]; // not enough space!strcpy(str2, str1); // overwrites other memory!

Writing past your memory bounds is called a “buffer overflow”. It can allow for security vulnerabilities!

Page 33: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

33

Copying Stringschar str1[] = "hello, world!";char str2[6]; // not enough space!strcpy(str2, str1); // overwrites other memory!

str1

0 1 2 3 4 5? ? ? ? ? ?str2

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ',' ' ' 'w' 'o' 'r' 'l' 'd' '!' '\0'

- other program memory -

Page 34: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

34

Copying Stringschar str1[] = "hello, world!";char str2[6]; // not enough space!strcpy(str2, str1); // overwrites other memory!

str1

0 1 2 3 4 5'h' ? ? ? ? ?str2 - other program memory -

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ',' ' ' 'w' 'o' 'r' 'l' 'd' '!' '\0'

Page 35: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

35

Copying Stringschar str1[] = "hello, world!";char str2[6]; // not enough space!strcpy(str2, str1); // overwrites other memory!

str1

0 1 2 3 4 5'h' 'e' ? ? ? ?str2 - other program memory -

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ',' ' ' 'w' 'o' 'r' 'l' 'd' '!' '\0'

Page 36: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

36

Copying Stringschar str1[] = "hello, world!";char str2[6]; // not enough space!strcpy(str2, str1); // overwrites other memory!

str1

0 1 2 3 4 5'h' 'e' 'l' ? ? ?str2 - other program memory -

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ',' ' ' 'w' 'o' 'r' 'l' 'd' '!' '\0'

Page 37: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

37

Copying Stringschar str1[] = "hello, world!";char str2[6]; // not enough space!strcpy(str2, str1); // overwrites other memory!

str1

0 1 2 3 4 5'h' 'e' 'l' 'l' ? ?str2 - other program memory -

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ',' ' ' 'w' 'o' 'r' 'l' 'd' '!' '\0'

Page 38: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

38

Copying Stringschar str1[] = "hello, world!";char str2[6]; // not enough space!strcpy(str2, str1); // overwrites other memory!

str1

0 1 2 3 4 5'h' 'e' 'l' 'l' 'o' ?str2 - other program memory -

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ',' ' ' 'w' 'o' 'r' 'l' 'd' '!' '\0'

Page 39: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

39

Copying Stringschar str1[] = "hello, world!";char str2[6]; // not enough space!strcpy(str2, str1); // overwrites other memory!

str1

0 1 2 3 4 5'h' 'e' 'l' 'l' 'o' ','str2 - other program memory -

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ',' ' ' 'w' 'o' 'r' 'l' 'd' '!' '\0'

Page 40: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

40

- other program memory -' '

Copying Stringschar str1[] = "hello, world!";char str2[6]; // not enough space!strcpy(str2, str1); // overwrites other memory!

str1

0 1 2 3 4 5'h' 'e' 'l' 'l' 'o' ','str2

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ',' ' ' 'w' 'o' 'r' 'l' 'd' '!' '\0'

Page 41: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

41

- other program memory -' ' 'w'

Copying Stringschar str1[] = "hello, world!";char str2[6]; // not enough space!strcpy(str2, str1); // overwrites other memory!

str1

0 1 2 3 4 5'h' 'e' 'l' 'l' 'o' ','str2

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ',' ' ' 'w' 'o' 'r' 'l' 'd' '!' '\0'

Page 42: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

42

- other program memory -' ' 'w' 'o'

Copying Stringschar str1[] = "hello, world!";char str2[6]; // not enough space!strcpy(str2, str1); // overwrites other memory!

str1

0 1 2 3 4 5'h' 'e' 'l' 'l' 'o' ','str2

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ',' ' ' 'w' 'o' 'r' 'l' 'd' '!' '\0'

Page 43: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

43

- other program memory -' ' 'w' 'o' 'r'

Copying Stringschar str1[] = "hello, world!";char str2[6]; // not enough space!strcpy(str2, str1); // overwrites other memory!

str1

0 1 2 3 4 5'h' 'e' 'l' 'l' 'o' ','str2

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ',' ' ' 'w' 'o' 'r' 'l' 'd' '!' '\0'

Page 44: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

44

- other program memory -' ' 'w' 'o' 'r' 'l'

Copying Stringschar str1[] = "hello, world!";char str2[6]; // not enough space!strcpy(str2, str1); // overwrites other memory!

str1

0 1 2 3 4 5'h' 'e' 'l' 'l' 'o' ','str2

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ',' ' ' 'w' 'o' 'r' 'l' 'd' '!' '\0'

Page 45: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

45

- other program memory -' ' 'w' 'o' 'r' 'l' 'd'

Copying Stringschar str1[] = "hello, world!";char str2[6]; // not enough space!strcpy(str2, str1); // overwrites other memory!

str1

0 1 2 3 4 5'h' 'e' 'l' 'l' 'o' ','str2

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ',' ' ' 'w' 'o' 'r' 'l' 'd' '!' '\0'

Page 46: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

46

- other program memory -' ' 'w' 'o' 'r' 'l' 'd' '!'

Copying Stringschar str1[] = "hello, world!";char str2[6]; // not enough space!strcpy(str2, str1); // overwrites other memory!

str1

0 1 2 3 4 5'h' 'e' 'l' 'l' 'o' ','str2

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ',' ' ' 'w' 'o' 'r' 'l' 'd' '!' '\0'

Page 47: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

47

- other program memory -' ' 'w' 'o' 'r' 'l' 'd' '!' '\0'

Copying Stringschar str1[] = "hello, world!";char str2[6]; // not enough space!strcpy(str2, str1); // overwrites other memory!

str1

0 1 2 3 4 5'h' 'e' 'l' 'l' 'o' ','str2

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ',' ' ' 'w' 'o' 'r' 'l' 'd' '!' '\0'

Page 48: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

48

- other program memory -' ' 'w' 'o' 'r' 'l' 'd' '!' '\0'

Copying Stringschar str1[] = "hello, world!";char str2[6]; // not enough space!strcpy(str2, str1); // overwrites other memory!

str1

0 1 2 3 4 5'h' 'e' 'l' 'l' 'o' ','str2

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ',' ' ' 'w' 'o' 'r' 'l' 'd' '!' '\0'

Page 49: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

49

Copying Stringsstrncpy copies at most the first n bytes of src to dst. If there is no null-terminating character in these bytes, then dst will not be null terminated!

// copying "hello"char str1[] = "hello, world!";char str2[5];strncpy(str2, str1, 5); // doesn’t copy '\0'!

If there is no null-terminating character, we may not be able to tell where theend of the string is anymore. E.g. strlen may continue reading into some other memory in search of '\0'!

Page 50: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

50

Copying Stringschar str1[] = "hello, world!";char str2[5];strncpy(str2, str1, 5);int length = strlen(str2);

str1

0 1 2 3 4? ? ? ? ?str2 - other program memory -

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ',' ' ' 'w' 'o' 'r' 'l' 'd' '!' '\0'

Page 51: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

51

Copying Stringschar str1[] = "hello, world!";char str2[5];strncpy(str2, str1, 5);int length = strlen(str2);

str1

0 1 2 3 4'h' ? ? ? ?str2 - other program memory -

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ',' ' ' 'w' 'o' 'r' 'l' 'd' '!' '\0'

Page 52: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

52

Copying Stringschar str1[] = "hello, world!";char str2[5];strncpy(str2, str1, 5);int length = strlen(str2);

str1

0 1 2 3 4'h' 'e' ? ? ?str2 - other program memory -

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ',' ' ' 'w' 'o' 'r' 'l' 'd' '!' '\0'

Page 53: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

53

Copying Stringschar str1[] = "hello, world!";char str2[5];strncpy(str2, str1, 5);int length = strlen(str2);

str1

0 1 2 3 4'h' 'e' 'l' ? ?str2 - other program memory -

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ',' ' ' 'w' 'o' 'r' 'l' 'd' '!' '\0'

Page 54: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

54

Copying Stringschar str1[] = "hello, world!";char str2[5];strncpy(str2, str1, 5);int length = strlen(str2);

str1

0 1 2 3 4'h' 'e' 'l' 'l' ?str2 - other program memory -

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ',' ' ' 'w' 'o' 'r' 'l' 'd' '!' '\0'

Page 55: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

55

Copying Stringschar str1[] = "hello, world!";char str2[5];strncpy(str2, str1, 5);int length = strlen(str2);

str1

0 1 2 3 4'h' 'e' 'l' 'l' 'o'str2 - other program memory -

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ',' ' ' 'w' 'o' 'r' 'l' 'd' '!' '\0'

Page 56: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

56

Copying Stringschar str1[] = "hello, world!";char str2[5];strncpy(str2, str1, 5);int length = strlen(str2);

str1

0 1 2 3 4'h' 'e' 'l' 'l' 'o'str2 - other program memory -

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ',' ' ' 'w' 'o' 'r' 'l' 'd' '!' '\0'

Page 57: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

57

Copying Stringschar str1[] = "hello, world!";char str2[5];strncpy(str2, str1, 5);int length = strlen(str2);

str1

str2

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ',' ' ' 'w' 'o' 'r' 'l' 'd' '!' '\0'

0 1 2 3 4'h' 'e' 'l' 'l' 'o' - other program memory -

Page 58: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

58

Copying Stringschar str1[] = "hello, world!";char str2[5];strncpy(str2, str1, 5);int length = strlen(str2);

str1

str2

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ',' ' ' 'w' 'o' 'r' 'l' 'd' '!' '\0'

0 1 2 3 4'h' 'e' 'l' 'l' 'o' - other program memory -

Page 59: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

59

Copying Stringschar str1[] = "hello, world!";char str2[5];strncpy(str2, str1, 5);int length = strlen(str2);

str1

str2

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ',' ' ' 'w' 'o' 'r' 'l' 'd' '!' '\0'

0 1 2 3 4'h' 'e' 'l' 'l' 'o' - other program memory -

Page 60: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

60

Copying Stringschar str1[] = "hello, world!";char str2[5];strncpy(str2, str1, 5);int length = strlen(str2);

str1

str2

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ',' ' ' 'w' 'o' 'r' 'l' 'd' '!' '\0'

0 1 2 3 4'h' 'e' 'l' 'l' 'o' - other program memory -

Page 61: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

61

Copying Stringschar str1[] = "hello, world!";char str2[5];strncpy(str2, str1, 5);int length = strlen(str2);

str1

str2

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ',' ' ' 'w' 'o' 'r' 'l' 'd' '!' '\0'

0 1 2 3 4'h' 'e' 'l' 'l' 'o' - other program memory -

Page 62: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

62

Copying Stringschar str1[] = "hello, world!";char str2[5];strncpy(str2, str1, 5);int length = strlen(str2);

str1

str2

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ',' ' ' 'w' 'o' 'r' 'l' 'd' '!' '\0'

0 1 2 3 4'h' 'e' 'l' 'l' 'o' - other program memory -

Page 63: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

63

Copying Stringschar str1[] = "hello, world!";char str2[5];strncpy(str2, str1, 5);int length = strlen(str2);

str1

str2

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ',' ' ' 'w' 'o' 'r' 'l' 'd' '!' '\0'

0 1 2 3 4'h' 'e' 'l' 'l' 'o' - other program memory -

Page 64: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

64

Copying Stringschar str1[] = "hello, world!";char str2[5];strncpy(str2, str1, 5);int length = strlen(str2);

str1

str2

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ',' ' ' 'w' 'o' 'r' 'l' 'd' '!' '\0'

0 1 2 3 4'h' 'e' 'l' 'l' 'o' - other program memory -

Page 65: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

65

Copying Stringschar str1[] = "hello, world!";char str2[5];strncpy(str2, str1, 5);int length = strlen(str2);

str1

str2

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ',' ' ' 'w' 'o' 'r' 'l' 'd' '!' '\0'

0 1 2 3 4'h' 'e' 'l' 'l' 'o' - other program memory -

Page 66: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

66

Copying Stringschar str1[] = "hello, world!";char str2[5];strncpy(str2, str1, 5);int length = strlen(str2);

str1

str2

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ',' ' ' 'w' 'o' 'r' 'l' 'd' '!' '\0'

0 1 2 3 4'h' 'e' 'l' 'l' 'o' - other program memory -

Page 67: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

67

Copying Stringschar str1[14];char *str2 = "hello there";strncpy(str1, str2, 5);

str1

0 1 2 3 4 5 6 7 8 9 10 11 12 13? ? ? ? ? ? ? ? ? ? ? ? ? ?

Page 68: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

68

Copying Stringschar str1[14];char *str2 = "hello there";strncpy(str1, str2, 5);

str1

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' ? ? ? ? ? ? ? ? ? ? ? ? ?

Page 69: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

69

Copying Stringschar str1[14];char *str2 = "hello there";strncpy(str1, str2, 5);

str1

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' ? ? ? ? ? ? ? ? ? ? ? ?

Page 70: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

70

Copying Stringschar str1[14];char *str2 = "hello there";strncpy(str1, str2, 5);

str1

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' ? ? ? ? ? ? ? ? ? ? ?

Page 71: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

71

Copying Stringschar str1[14];char *str2 = "hello there";strncpy(str1, str2, 5);

str1

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' ? ? ? ? ? ? ? ? ? ?

Page 72: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

72

Copying Stringschar str1[14];char *str2 = "hello there";strncpy(str1, str2, 5);

str1

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ? ? ? ? ? ? ? ? ?

Page 73: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

73

Copying Stringschar str1[14];char *str2 = "hello there";strncpy(str1, str2, 5);

str1

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ? ? ? ? ? ? ? ? ?

Page 74: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

74

Copying Stringschar str1[14];char *str2 = "hello there";strncpy(str1, str2, 5);printf("%s\n", str1);

str1

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ? ? ? ? ? ? ? ? ?

Page 75: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

75

Copying Stringschar str1[14];char *str2 = "hello there";strncpy(str1, str2, 5);printf("%s\n", str1);

str1

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ? ? ? ? ? ? ? ? ?

Page 76: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

76

Copying Stringschar str1[14];char *str2 = "hello there";strncpy(str1, str2, 5);printf("%s\n", str1);

str1

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ? ? ? ? ? ? ? ? ?

Page 77: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

77

Copying Stringschar str1[14];char *str2 = "hello there";strncpy(str1, str2, 5);printf("%s\n", str1);

str1

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ? ? ? ? ? ? ? ? ?

Page 78: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

78

Copying Stringschar str1[14];char *str2 = "hello there";strncpy(str1, str2, 5);printf("%s\n", str1);

str1

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ? ? ? ? ? ? ? ? ?

Page 79: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

79

Copying Stringschar str1[14];char *str2 = "hello there";strncpy(str1, str2, 5);printf("%s\n", str1);

str1

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ? ? ? ? ? ? ? ? ?

Page 80: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

80

Copying Stringschar str1[14];char *str2 = "hello there";strncpy(str1, str2, 5);printf("%s\n", str1);

str1

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ? ? ? ? ? ? ? ? ?

Page 81: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

81

Copying Stringschar str1[14];char *str2 = "hello there";strncpy(str1, str2, 5);printf("%s\n", str1);

str1

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ? ? ? ? ? ? ? ? ?

Page 82: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

82

Copying Stringschar str1[14];char *str2 = "hello there";strncpy(str1, str2, 5);printf("%s\n", str1);

str1

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ? ? ? ? ? ? ? ? ?

Page 83: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

83

Copying Stringschar str1[14];char *str2 = "hello there";strncpy(str1, str2, 5);printf("%s\n", str1);

str1

0 1 2 3 4 5 6 7 8 9 10 11 12 13'h' 'e' 'l' 'l' 'o' ? ? ? ? ? ? ? ? ?

$ ./strncpy_buggy wonderfulword: wonderfulwordcopy: wonde⍰⍰J⍰⍰⍰

Page 84: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

84

Copying StringsIf necessary, make sure to add a null-terminating character yourself.

// copying "hello"char str1[] = "hello, world!";char str2[6]; // room for string and '\0'strncpy(str2, str1, 5); // doesn’t copy '\0'!str2[5] = '\0'; // add null-terminating char

Page 85: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

85

String Copying ExerciseWhat value should go in the blank at right?• A: 4• B: 5• C: 6• D: 12• E: strlen("hello")• F: Something else

char *hello = "hello";char str[______];strcpy(str, hello);

Page 86: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

86

Concatenating StringsYou cannot concatenate C strings using +. This adds character addresses!

char *str1 = "hello "; // e.g. 0x7f42char *str2 = "world!"; // e.g. 0x6541.char *str3 = str1 + str2;// doesn’t compile!

Instead, use strcat:

char str1[13] = "hello ";// enough space for strings + '\0’char str2[] = "world!"; // e.g. 0x6541.strcat(str1, str2); // removes old '\0', adds new '\0' at endprintf("%s", str1); // hello world!

Both strcat and strncat remove the old '\0' and add a new one at the end.

Page 87: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

87

Concatenating Stringschar str1[13] = "hello ";char str2[] = "world!";strcat(str1, str2);

str1

0 1 2 3 4 5 6'w' 'o' 'r' 'l' 'd' '!' '\0'str2

0 1 2 3 4 5 6 7 8 9 10 11 12'h' 'e' 'l' 'l' 'o' ' ' '\0' ? ? ? ? ? ?

Page 88: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

88

Concatenating Stringschar str1[13] = "hello ";char str2[] = "world!";strcat(str1, str2);

str1

str2

0 1 2 3 4 5 6 7 8 9 10 11 12'h' 'e' 'l' 'l' 'o' ' ' 'w' ? ? ? ? ? ?

0 1 2 3 4 5 6'w' 'o' 'r' 'l' 'd' '!' '\0'

Page 89: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

89

Concatenating Stringschar str1[13] = "hello ";char str2[] = "world!";strcat(str1, str2);

str1

str2

0 1 2 3 4 5 6 7 8 9 10 11 12'h' 'e' 'l' 'l' 'o' ' ' 'w' 'o' ? ? ? ? ?

0 1 2 3 4 5 6'w' 'o' 'r' 'l' 'd' '!' '\0'

Page 90: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

90

Concatenating Stringschar str1[13] = "hello ";char str2[] = "world!";strcat(str1, str2);

str1

str2

0 1 2 3 4 5 6 7 8 9 10 11 12'h' 'e' 'l' 'l' 'o' ' ' 'w' 'o' 'r' ? ? ? ?

0 1 2 3 4 5 6'w' 'o' 'r' 'l' 'd' '!' '\0'

Page 91: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

91

Concatenating Stringschar str1[13] = "hello ";char str2[] = "world!";strcat(str1, str2);

str1

str2

0 1 2 3 4 5 6 7 8 9 10 11 12'h' 'e' 'l' 'l' 'o' ' ' 'w' 'o' 'r' 'l' ? ? ?

0 1 2 3 4 5 6'w' 'o' 'r' 'l' 'd' '!' '\0'

Page 92: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

92

Concatenating Stringschar str1[13] = "hello ";char str2[] = "world!";strcat(str1, str2);

str1

str2

0 1 2 3 4 5 6 7 8 9 10 11 12'h' 'e' 'l' 'l' 'o' ' ' 'w' 'o' 'r' 'l' 'd' ? ?

0 1 2 3 4 5 6'w' 'o' 'r' 'l' 'd' '!' '\0'

Page 93: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

93

Concatenating Stringschar str1[13] = "hello ";char str2[] = "world!";strcat(str1, str2);

str1

str2

0 1 2 3 4 5 6 7 8 9 10 11 12'h' 'e' 'l' 'l' 'o' ' ' 'w' 'o' 'r' 'l' 'd' '!' ?

0 1 2 3 4 5 6'w' 'o' 'r' 'l' 'd' '!' '\0'

Page 94: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

94

Concatenating Stringschar str1[13] = "hello ";char str2[] = "world!";strcat(str1, str2);

str1

str2

0 1 2 3 4 5 6 7 8 9 10 11 12'h' 'e' 'l' 'l' 'o' ' ' 'w' 'o' 'r' 'l' 'd' '!' '\0'

0 1 2 3 4 5 6'w' 'o' 'r' 'l' 'd' '!' '\0'

Page 95: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

95

Concatenating Stringschar str1[13] = "hello ";char str2[] = "world!";strcat(str1, str2);

str1

str2

0 1 2 3 4 5 6 7 8 9 10 11 12'h' 'e' 'l' 'l' 'o' ' ' 'w' 'o' 'r' 'l' 'd' '!' '\0'

0 1 2 3 4 5 6'w' 'o' 'r' 'l' 'd' '!' '\0'

Page 96: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

96

SubstringsSince C strings are pointers to characters, we can adjust the pointer to omit characters at the beginning.

// Want just "car"char *str1 = "racecar";

0xf1 0xf2 0xf3 0xf4 0xf5 0xf6 0xf7 0xf8'r' 'a' 'c' 'e' 'c' 'a' 'r' '\0'

str1

0xee0xf1

Page 97: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

97

SubstringsSince C strings are pointers to characters, we can adjust the pointer to omit characters at the beginning.

// Want just "car"char *str1 = "racecar";char *str2 = str1 + 4;

0xf1 0xf2 0xf3 0xf4 0xf5 0xf6 0xf7 0xf8'r' 'a' 'c' 'e' 'c' 'a' 'r' '\0'

str1

0xee0xf1 str2

0xd20xf5

Page 98: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

98

SubstringsSince C strings are pointers to characters, we can adjust the pointer to omit characters at the beginning.

// Want just "car"char *str1 = "racecar";char *str2 = str1 + 4;printf("%s\n", str1); // racecarprintf("%s\n", str2); // car

0xf1 0xf2 0xf3 0xf4 0xf5 0xf6 0xf7 0xf8'r' 'a' 'c' 'e' 'c' 'a' 'r' '\0'

str1

0xee0xf1 str2

0xd20xf5

Page 99: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

99

SubstringsSince C strings are pointers to characters, we can adjust the pointer to omit characters at the beginning. NOTE: the pointer still refers to the same characters!

char str1[] = "racecar";char *str2 = str1 + 4;str2[0] = 'f';printf("%s\n", str1);printf("%s\n", str2);

0xf1 0xf2 0xf3 0xf4 0xf5 0xf6 0xf7 0xf8'r' 'a' 'c' 'e' 'c' 'a' 'r' '\0'str1

str2

0xd20xf5

Page 100: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

100

SubstringsSince C strings are pointers to characters, we can adjust the pointer to omit characters at the beginning. NOTE: the pointer still refers to the same characters!

char str1[] = "racecar";char *str2 = str1 + 4;str2[0] = 'f';printf("%s\n", str1);printf("%s\n", str2);

0xf1 0xf2 0xf3 0xf4 0xf5 0xf6 0xf7 0xf8'r' 'a' 'c' 'e' 'f' 'a' 'r' '\0'str1

str2

0xd20xf5

Page 101: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

101

SubstringsSince C strings are pointers to characters, we can adjust the pointer to omit characters at the beginning. NOTE: the pointer still refers to the same characters!

char str1[] = "racecar";char *str2 = str1 + 4;str2[0] = 'f';printf("%s\n", str1); // racefarprintf("%s\n", str2); // far

0xf1 0xf2 0xf3 0xf4 0xf5 0xf6 0xf7 0xf8'r' 'a' 'c' 'e' 'f' 'a' 'r' '\0'str1

str2

0xd20xf5

Page 102: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

102

SubstringsTo omit characters at the end, make a new string that is a partial copy of the original.

// Want just "race"char *str1 = "racecar";

Page 103: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

103

SubstringsTo omit characters at the end, make a new string that is a partial copy of the original.

// Want just "race"char *str1 = "racecar";char str2[5];

Page 104: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

104

SubstringsTo omit characters at the end, make a new string that is a partial copy of the original.

// Want just "race"char *str1 = "racecar";char str2[5];strncpy(str2, str1, 4);

Page 105: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

105

SubstringsTo omit characters at the end, make a new string that is a partial copy of the original.

// Want just "race"char *str1 = "racecar";char str2[5];strncpy(str2, str1, 4);str2[4] = '\0';

Page 106: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

106

SubstringsTo omit characters at the end, make a new string that is a partial copy of the original.

// Want just "race"char *str1 = "racecar";char str2[5];strncpy(str2, str1, 4);str2[4] = '\0';printf("%s\n", str1); // racecarprintf("%s\n", str2); // race

Page 107: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

107

SubstringsWe can combine pointer arithmetic and copying to make any substrings we’d like.

// Want just "ace"char *str1 = "racecar";

Page 108: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

108

SubstringsWe can combine pointer arithmetic and copying to make any substrings we’d like.

// Want just "ace"char *str1 = "racecar";char str2[4];

Page 109: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

109

SubstringsWe can combine pointer arithmetic and copying to make any substrings we’d like.

// Want just "ace"char *str1 = "racecar";char str2[4];strcpy(str2, str1 + 1, 3);

Page 110: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

110

SubstringsWe can combine pointer arithmetic and copying to make any substrings we’d like.

// Want just "ace"char *str1 = "racecar";char str2[4];strcpy(str2, str1 + 1, 3);str2[4] = '\0';

Page 111: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

111

SubstringsWe can combine pointer arithmetic and copying to make any substrings we’d like.

// Want just "ace"char *str1 = "racecar";char str2[4];strcpy(str2, str1 + 1, 3);str2[4] = '\0';printf("%s\n", str1); // racecarprintf("%s\n", str2); // ace

Page 112: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

112

Plan For Today• Characters• Strings• Common String Operations• Comparing• Copying• Concatenating• Substrings

• Break: Announcements• Practice: Diamond• More String Operations: Searching and Spans

Page 113: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

113

Announcements• Clarification: reusing code from prior quarters you took CS107• Emacs and GDB configuration files• cs107.stanford.edu/resources/emacs• cs107.stanford.edu/resources/gdb

• We hope you enjoyed your first lab!• 3 minute break

Page 114: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

114

Plan For Today• Characters• Strings• Common String Operations• Comparing• Copying• Concatenating• Substrings

• Break: Announcements• Practice: Diamond• More String Operations: Searching and Spans

Page 115: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

115

String Diamond• Write a function diamond that accepts a string parameter and prints its letters

in a "diamond" format as shown below.• For example, diamond("DAISY") should print:

DDADAIDAISDAISYAISYISYSYY

Page 116: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

116

String Diamond• Write a function diamond that accepts a string parameter and prints its letters

in a "diamond" format as shown below.• For example, diamond("DAISY") should print:

DDADAIDAISDAISYAISYISYSYY

Page 117: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

117

Daisy!

Page 118: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

118

Practice: Diamond

Page 119: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

119

Plan For Today• Characters• Strings• Common String Operations• Comparing• Copying• Concatenating• Substrings

• Break: Announcements• Practice: Diamond• More String Operations: Searching and Spans

Page 120: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

120

Searching For Lettersstrchr returns a pointer to the first occurrence of a character in a string, or NULL if the character is not in the string.

char *daisy = "Daisy";char *letterA = strchr(daisy, 'a');printf("%s\n", daisy); // Daisyprintf("%s\n", letterA); // aisy

If there are multiple occurrences of the letter, strchr returns a pointer to the first one. Use strrchr to obtain a pointer to the last occurrence.

Page 121: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

121

Searching For Stringsstrstr returns a pointer to the first occurrence of the second string in the first, or NULL if it cannot be found.

char *daisy = "Daisy Dog";char *substr = strstr(daisy, "Dog");printf("%s\n", daisy); // Daisy Dogprintf("%s\n", substr); // Dog

If there are multiple occurrences of the string, strstr returns a pointer to the first one.

Page 122: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

122

String Spansstrspn returns the length of the initial part of the first string which contains only characters in the second string.

char *daisy = "Daisy Dog";int spanLength = strspn(daisy, "Daeoi"); // 3

Page 123: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

123

String Spansstrcspn (c = “complement”) returns the length of the initial part of the first string which contains only characters not in the second string.

char *daisy = "Daisy Dog";int spanLength = strcspn(daisy, "isdor"); // 2

Page 124: CS107, Lecture 4 - Stanford UniversityCS107, Lecture 4 C Strings Reading: K&R (1.9, 5.5, Appendix B3) or Essential C section 3 2 Plan For Today •Characters •Strings •Common String

124

Recap• Characters• Strings• Common String Operations• Comparing• Copying• Concatenating• Substrings

• Break: Announcements• Practice: Diamond• More String Operations: Searching and SpansNext time (video recording only): more strings