Dealing with char
, char*
, and char []
in C is a little confusing in the beginning.
Take a look at the following statements:
char str1[] = "abcd"; char const* str2 = "xyz"; char* cp = str1; char c = *cp;
The first statement and the second statement are identical in their behavior. After the first statement is executed, str1
points to a location that contains 4 characters, in consecutive order. If you think of the memory locations for the string, you might see something like:
+---+---+---+---+ | a | b | c | d | +---+---+---+---+
str1
points to the address where a
is stored. There is a similar arrangement for storing the string "xyz"
and str2
points to the address where x
is stored.
In the third statement, you are creating cp
and making it point where str1
is pointing. After that statement, both cp
and str1
point to the same string – "abcd"
.
*cp
evaluates to the character that exists at the address that cp
points to. In this case, it will be 'a'
.
In the fourth statement, you are initializing c
with 'a'
, the character that exists at the address pointed to by cp
.
Now, if you try a statement
*cp = str2;
it is a compiler error. *cp
simply dereferences the address of cp
. You can put a char
at that location, not str2
, which is a char*
.
You can execute
*cp = *str2;
After that, the objects in the memory that str1
and cp
point to will look like:
+---+---+---+---+ | x | b | c | d | +---+---+---+---+
If you want to copy the string from the address pointed to by str1
to the address pointed to by cp
, you can use the standard library function strcpy
.
strcpy(cp, str2);
You have to be careful about using strcpy
because you have to have enough valid memory to copy to. In this particular example, if you tried
char str3[2]; strcpy(str3, cp);
you will get undefined behavior since there isn’t enough memory in str3
to be able to copy "abcd"
.
Hope that made sense.
Here’s a modified version of your code that should work:
#include <stdio.h> #include <ctype.h> #include <string.h> void getname(char *whatname, char *whatlastname); int main() { int option = 0; char guyname[32]; char lastname[32]; bool name_entered = false; do{ printf("1. Enter name.\n"); printf("2. Enter exam scores.\n"); printf("3. Display average exam scores. \n"); printf("4. Display summary. \n"); printf("5. Quit. \n"); scanf("%i", &option); if( option == 1 ) { name_entered = true; getname(guyname, lastname); } else if( option == 5 ) { printf(" Come back with a better grade next time."); break; } }while (!(option >5 || option <1)); return 0; }