Cstring Literals Two features of string literal values come to the fore here. First, you can pass a string literal to a Cstring argument if that argument is const. (See below for more.) Second, when the compiler finds two string literals separated by naught but whitespace, it will automatically concatenate them. Note how this aids in the building of the fifth error message in the array (which would have normally been too long and been cut off at the edge of a printout). Cstring Arguments By design, Cstring arguments require no data length argument accompany them to functions. But, one often overlooked feature of Cstring arguments is their use in generalizing a function without losing centrality (lessening cohesion). By passing things such as prompts and error messages to your functions via Cstring arguments, your caller can make all user interaction just as they please. Note how this is done in the get_nonneg() function. Even better, note how by having the Cstring arguments be const, the caller can provide their prompt and error message as literal strings. Thus they can avoid having to come up silly names for variables to hold these Cstrings. Two-D Arrays An array of Cstrings is by its nature 2D. We can hide this aspect by using a typedef (type definition). Such typedef's can be placed in a particular function, global to a program file, or in a library for anyone to #include and use. Please note that the typedef for an array (Cstring here) also needs a constant to go along with it. This should be placed immediately before the typedef where-ever that may end up (see above). The Message typedef in this program is hidden inside the function as it isn't used anywhere else. Note how the messages array appears 1D, but is in reality 2D because its base type is a 1D array. Branching Yes, both if structures in this program could have been done as ?: operations. However, for clarity, I chose to do them out the long way. Please feel free to re-do them as ?:s as an exercise. *smile*