1) A drawing of an array of 9 characters called buf, indexed from 0-8. The initial contents are the string "Chadwick" and a null terminator. When we write char *word = buf + 2, word is a char *pointer that points to index 2, the first "a". When we write strncpy(word, "ris", 3), this overwrites that "a" with an "r", the next "d" with an "i", and the next "w" with an "s". Thus, when we print it out, it will print out "Chrisick". 2) The following two lines of code are equivalent: strcpy(dst, src); strncpy(dst, src, strlen(src) + 1); 3) The following two blocks of code have some important differences: Block 1 start char *str; strcpy(str, "Hi!"); Block 1 end Block 2 start char str[6]; strcpy(str, "Hi!"); Block 2 end Block 1 is invalid - str is space for an 8 byte number, but no space is ever created to store any characters. So unless we initialize it to point to some other existing string, we cannot pass it in to strcpy - this will copy "Hi!" to a random location because str is initially garbage. Block 2 is valid - str is space for 6 characters. So we can copy into it as we expect. 4) strcat(dst, src) is the same as strcpy(dst + strlen(dst), src). We have an drawing of an array of 9 characters called dst, with an example string "Hi" followed by a null terminator. The null terminator is crossed out and replaced with a space, followed by the remaining characters in "there" and a null terminator. If we add strlen(dst) to dst, we advance past the "H" and "i" and land on the null terminator - there are arrows indicating these jumps. Thus, strcpy will start copying in the source string at the location of the null terminator.