home *** CD-ROM | disk | FTP | other *** search
- Chapter 7 - Strings and Arrays
-
-
- WHAT IS A STRING?
-
- A string is a group of characters, usually letters of
-
- the alphabet. In order to format your printout in such a
-
- way that it looks nice, has meaningful titles and names, and
-
- is esthetically pleasing to you and the people using the
-
- output of your program, you need the ability to output text
-
- data. Actually you have already been using strings, because
-
- the second program in this tutorial, way back in Chapter 2,
-
- output a message that was handled internally as a string. A
-
- complete definition is a series of "char" type data
-
- terminated by a NULL character, which is a zero.
-
- When C is going to use a string of data in some way,
-
- either to compare it with another, output it, copy it to
-
- another string, or whatever, the functions are set up to do
-
- what they are called to do until a NULL, which is a zero, is
-
- detected.
-
- WHAT IS AN ARRAY?
-
- An array is a series of homogeneous pieces of data that
-
- are all identical in type, but the type can be quite complex
-
- as we will see when we get to the chapter of this tutorial
-
- discussing structures. A string is simply a special case of
-
- an array.
-
- The best way to see these principles is by use of an
-
- example, so load the program CHRSTRG.C and display it on
-
- your monitor. The first thing new is the line that defines
-
- a "char" type of data entity. The square brackets define an
-
- array subscript in C, and in the case of the data definition
-
- statement, the 5 in the brackets defines 5 data fields of
-
- type "char" all defined as the variable "name". In the C
-
- language, all subscripts start at 0 and increase by 1 each
-
- step up to the maximum which in this case is 4. We
-
- therefore have 5 "char" type variables named, "name[0]",
-
- "name[1]", "name[2]", "name[3]", and "name[4]". You must
-
- keep in mind that in C, the subscripts actually go from 0 to
-
- one less than the number defined in the definition
-
- statement.
-
- HOW DO WE USE THE STRING?
-
- The variable "name" is therefore a string which can
-
- hold up to 5 characters, but since we need room for the NULL
-
- character, there are actually only four useful characters.
-
- To load something useful into the string, we have 5
-
- statements, each of which assigns one alphabetical character
-
- to one of the string characters. Finally, the last place in
-
- the string is filled with the numeral 0 as the end indicator
-
-
-
- Page 42
-
-
-
-
-
-
-
-
-
- Chapter 7 - Strings and Arrays
-
-
- and the string is complete. (A "define" would allow us to
-
- use "NULL" instead of a zero, and this would add greatly to
-
- the clarity of the program. It would be very obvious that
-
- this was a NULL and not simply a zero for some other
-
- purpose.) Now that we have the string, we will simply print
-
- it out with some other string data in the output statement.
-
- The %s is the output definition to output a string and
-
- the system will output characters starting with the first
-
- one in "name" until it comes to the NULL character, and it
-
- will quit. Notice that in the "printf" statement, only the
-
- variable name "name" needs to be given, with no subscript
-
- since we are interested in starting at the beginning.
-
- (There is actually another reason that only the variable
-
- name is given without brackets. The discussion of that
-
- topic will be given in the next chapter.)
-
- OUTPUTTING PART OF A STRING
-
- The next "printf" illustrates that we can output any
-
- single character of the string by using the "%c" and naming
-
- the particular character of "name" we want by including the
-
- subscript. The last "printf" illustrates how we can output
-
- part of the string by stating the starting point by using a
-
- subscript. The & specifies the address of "name[1]". We
-
- will study this in the next chapter but I thought you would
-
- benefit from a little glimpse ahead.
-
- This example may make you feel that strings are rather
-
- cumbersome to use since you have to set up each character
-
- one at a time. That is an incorrect conclusion because
-
- strings are very easy to use as we will see in the next
-
- example program.
-
- Compile and run this program.
-
- SOME STRING SUBROUTINES
-
- Load the example program STRINGS.C for an example of
-
- some ways to use strings. First we define four strings.
-
- Next we come to a new function that you will find very
-
- useful, the "strcpy" function, or string copy. It copies
-
- from one string to another until it comes to the NULL
-
- character. It is easy to remember which one gets copied to
-
- which if you think of them like an assignment statement.
-
- Thus if you were to say, for example, "x = 23;", the data is
-
- copied from the right entity to the left one. In the
-
- "strcpy" function, the data is also copied from the right
-
- entity to the left, so that after execution of the first
-
- statement, name1 will contain the string "Rosalinda", but
-
-
-
-
-
- Page 43
-
-
-
-
-
-
-
-
-
- Chapter 7 - Strings and Arrays
-
-
- without the double quotes, they are the compiler's way of
-
- knowing that you are defining a string.
-
- Likewise, "Zeke" is copied into "name2" by the second
-
- statement, then the "title" is copied. The title and both
-
- names are then printed out. Note that it is not necessary
-
- for the defined string to be exactly the same size as the
-
- string it will be called upon to store, only that it is at
-
- least as long as the string plus one more character for the
-
- NULL.
-
- ALPHABETICAL SORTING OF STRINGS
-
- The next function we will look at is the "strcmp" or
-
- the string compare function. It will return a 1 if the
-
- first string is larger than the second, zero if they are the
-
- same length and have the same characters, and -1 if the
-
- first string is smaller than the second. One of the
-
- strings, depending on the result of the compare is copied
-
- into the variable "mixed", and the largest name
-
- alphabetically is printed out. It should come as no
-
- surprise to you that "Zeke" wins because it is
-
- alphabetically larger, length doesn't matter, only the
-
- alphabet. It might be wise to mention that the result would
-
- also depend on whether the letters were upper or lower case.
-
- There are functions available with your C compiler to change
-
- the case of a string to all upper or all lower case if you
-
- desire. These will be used in an example program later in
-
- this tutorial.
-
- COMBINING STRINGS
-
- The last four statements have another new feature, the
-
- "strcat", or string concatenation function. This function
-
- simply adds the characters from one string onto the end of
-
- another string taking care to adjust the NULL so everything
-
- is still all right. In this case, "name1" is copied into
-
- "mixed", then two blanks are concatenated to "mixed", and
-
- finally "name2" is concatenated to the combination. The
-
- result is printed out with both names in the one variable
-
- "mixed".
-
- Strings are not difficult and are extremely useful.
-
- You should spend some time getting familiar with them before
-
- proceeding on to the next topic.
-
- Compile and run this program and observe the results
-
- for compliance with this definition.
-
-
-
-
-
-
- Page 44
-
-
-
-
-
-
-
-
-
- Chapter 7 - Strings and Arrays
-
-
- AN ARRAY OF INTEGERS
-
- Load the file INTARRAY.C and display it on your monitor
-
- for an example of an array of integers. Notice that the
-
- array is defined in much the same way we defined an array of
-
- char in order to do the string manipulations in the last
-
- section. We have 12 integer variables to work with not
-
- counting the one named "index". The names of the variables
-
- are "values[0]", "values[1]", ... , and "values[11]". Next
-
- we have a loop to assign nonsense, but well defined, data to
-
- each of the 12 variables, then print all 12 out. You should
-
- have no trouble following this program, but be sure you
-
- understand it. Compile and run it to see if it does what
-
- you expect it to do.
-
- AN ARRAY OF FLOATING POINT DATA
-
- Load and display the program named BIGARRAY.C for an
-
- example of a program with an array of "float" type data.
-
- This program has an extra feature to illustrate how strings
-
- can be initialized. The first line of the program
-
- illustrates to you how to initialize a string of characters.
-
- Notice that the square brackets are empty leaving it up to
-
- the compiler to count the characters and allocate enough
-
- space for our string. Another string is initialized in the
-
- body of the program but it must be declared "static" here.
-
- This prevents it from being allocated as an "automatic"
-
- variable and allows it to retain the string once the program
-
- is started. There is nothing else new here, the variables
-
- are assigned nonsense data and the results of all the
-
- nonsense are printed out along with a header. This program
-
- should also be easy for you to follow, so study it until you
-
- are sure of what it is doing before going on to the next
-
- topic.
-
- GETTING DATA BACK FROM A FUNCTION
-
- Back in chapter 5 when we studied functions, I hinted
-
- to you that there was a way to get data back from a function
-
- by using an array, and that is true. Load the program
-
- PASSBACK.C for an example of doing that. In this program,
-
- we define an array of 20 variables named "matrix", then
-
- assign some nonsense data to the variables, and print out
-
- the first five. Then we call the function "dosome" taking
-
- along the entire array by putting the name of the array in
-
- the parentheses.
-
- The function "dosome" has a name in its parentheses
-
- also but it prefers to call the array "list". The function
-
- needs to be told that it is really getting an array passed
-
- to it and that the array is of type "int". The following
-
-
-
- Page 45
-
-
-
-
-
-
-
-
-
- Chapter 7 - Strings and Arrays
-
-
- line, prior to the bracket which starts the program, does
-
- that by defining "list" as an integer type variable and
-
- including the square brackets to indicate an array. It is
-
- not necessary to tell the function how many elements are in
-
- the array, but you could if you so desired. Generally a
-
- function works with an array until some end-of-data marker
-
- is found, such as a NULL for a string, or some other
-
- previously defined data or pattern. Many times, another
-
- piece of data is passed to the function with a count of how
-
-
- many elements to work with. In our present illustration, we
-
- will use a fixed number of elements to keep it simple.
-
- So far nothing is different from the previous functions
-
- we have called except that we have passed more data points
-
- to the function this time than we ever have before, having
-
- passed 20 integer values. We print out the first 5 again to
-
- see if they did indeed get passed here. Then we add ten to
-
- each of the elements and print out the new values. Finally
-
- we return to the main program and print out the same 5 data
-
- points. We find that we have indeed modified the data in
-
- the function, and when we returned to the main program, we
-
- brought the changes back. Compile and run this program to
-
- verify this conclusion.
-
- ARRAYS PASS DATA BOTH WAYS
-
- We stated during our study of functions that when we
-
- passed data to a function, the system made a copy to use in
-
- the function which was thrown away when we returned. This
-
- is not the case with arrays. The actual array is passed to
-
- the function and the function can modify it any way it
-
- wishes to. The result of the modifications will be
-
- available back in the calling program. This may seem
-
- strange to you that arrays are handled differently from
-
- single point data, but they are. It really does make sense,
-
- but you will have to wait until we get to pointers to
-
- understand it.
-
- A HINT AT A FUTURE LESSON
-
- Another way of getting data back from a function to the
-
- calling program is by using pointers which we will cover in
-
- the next chapter. When we get there we will find that an
-
- array is in reality a pointer to a list of values. Don't
-
- let that worry you now, it will make sense when we get
-
- there. In the meantime concentrate on arrays and understand
-
- the basics of them because when we get to the study of
-
- structures we will be able to define some pretty elaborate
-
- arrays.
-
-
-
-
- Page 46
-
-
-
-
-
-
-
-
-
- Chapter 7 - Strings and Arrays
-
-
- MULTIPLY DIMENSIONED ARRAYS
-
- Load and display the file named MULTIARY.C for an
-
- example of a program with doubly dimensioned arrays. The
-
- variable "big" is an 8 by 8 array that contains 8 times 8 or
-
- 64 elements total. The first element is "big[0][0]", and
-
- the last is "big[7][7]". Another array named "huge" is also
-
- defined which is not square to illustrate that the array
-
- need not be square. Both are filled up with data, one
-
-
- representing a multiplication table and the other being
-
- formed into an addition table.
-
- To illustrate that individual elements can be modified
-
- at will, one of the elements of "big" is assigned the value
-
- from one of the elements of "huge" after being multiplied by
-
- 22. Next "big[2][2]" is assigned the arbitrary value of 5,
-
- and this value is used for the subscripts of the next
-
- assignment statement. The third assignment statement is in
-
- reality "big[5][5] = 177" because each of the subscripts
-
- contain the value 5. This is only done to illustrate that
-
- any valid expression can be used for a subscript. It must
-
- only meet two conditions, it must be an integer (although a
-
- "char" will work just as well), and it must be within the
-
- range of the subscript it is being used for.
-
- The entire matrix variable "big" is printed out in a
-
- square form so you can check the values to see if they did
-
- get set the way you expected them to.
-
- PROGRAMMING EXERCISES
-
- 1. Write a program with three short strings, about 6
-
- characters each, and use "strcpy" to copy "one", "two",
-
- and "three" into them. Concatenate the three strings
-
- into one string and print the result out 10 times.
-
- 2. Define two integer arrays, each 10 elements long,
-
- called "array1" and "array2". Using a loop, put some
-
- kind of nonsense data in each and add them term for
-
- term into another 10 element array named "arrays".
-
- Finally, print all results in a table with an index
-
- number.
- 1 2 + 10 = 12
- 2 4 + 20 = 24
- 3 6 + 30 = 36 etc.
-
- Hint; The print statement will be similar to;
- printf("%4d %4d + %4d = %4d\n",index,array1[index],
- array2[index],arrays[index]);
-
-
-
- Page 47
-