[Courses] [C] Beginner's Lesson 4A: Arrays, Qualifiers, and R eading Numbers

Anand R anand.r at cybertech.co.in
Fri Oct 11 16:01:10 EST 2002


[root at tux linuxchix]# gcc a.c -o a -Wall
a.c: In function `main':
a.c:13: warning: passing arg 2 of `strcat' makes pointer from integer
without a cast
[root at tux linuxchix]# 


-----------------------------------------------------------------------
>>>>  Debugging exercise.  What is wrong with the following program?
>>>>	
		#include <string.h>
		#include <stdio.h>
		int main(void)
		{
			char first[100];
			char last[100];
			char full[200];

			strcpy(first, "John");
			strcpy(last, "Doe");

			strcpy(full, first);
			strcat(full, ' ');
			strcat(full, last);
			printf("The name is %s\n", full);
			return 0;
		}
	
	Okay, now it looks like things are going to get interesting!
	So far, we've been supplying all the data to our programs.
	Now it looks like we're going to learn a way to enter some
	data from the keyboard! !@#$%&*8^)

	The standard library function fgets() can be used to read a
	string from the keyboard. The general form of fgets() is:

		fgets( array_name, sizeof(array_name), stdin);

	where array_name is the name of a character array;
sizeof(array_name)
	is used to indicate the maximum characters to read, minus one for
NUL;
	and stdin is the file to read.  In this case stdin is the standard
	input, or keyboard.  This program reads a line entered by the user
	and reports the length of the line. Since fgets() includes the
	end-of-line character, your string length will include a newline 
	('\n').

		#include <string.h>
		#include <stdio.h>
		int main(void)
		{
			char line[80];

			printf("Enter a line: ");
			fgets(line, sizeof(line), stdin);
			printf("The length of the line is: %d\n",
strlen(line));
			return 0;
		}

	Why don't we change the name program listed above to ask for the
	user's first and last name?  Here is one way to do it:

		
		#include <string.h>
		#include <stdio.h>
		int main(void)
		{
			char first[20];
			char last[20];
			char full_name[40];
			
			printf("Enter first name: ");
			fgets(first, sizeof(first), stdin);
			first[strlen(first) -1] = '\0'; /* trim off last
character */
			printf("Enter last name: ");
			fgets(last, sizeof(last), stdin);
			last[strlen(last) -1] = '\0'; /* trim off last
character */
			
			strcpy(full, first);
			strcat(full, " "); 
			strcat(full, last); 
			                 
			printf("The name is %s.\n", full);
			return 0;
		}

	Running the program gives the following output:

			Enter first name: Jane
			Enter last name: Doe
			The name is Jane Doe.
	
	So what's the deal with having to trim off the last character?
	Since fgets() includes the newline and since there is a NUL
	at the end of the string, if you don't trim off the last
	character, the output would look like this:

			The name is Jane
			Doe.
	
	Here is what the array last[] looks like after "Doe" is entered:

		last[0] = 'D'
		last[1] = 'o'
		last[2] = 'e'
		last[3] = '\n'
		last[4] = '\0'  /* end of string */

	The line  last[strlen(last) - 1] = '\0';  overwrites the newline
	with a NUL so the name will all come out on the same line. Cool.

Multiple dimensional arrays have more than one dimension. We can
declare a two dimensional array like this:

	/* comment stating what the array is for */
	type array_name[size1][size2];

Note that each dimension is in square brackets.  matrix[5][5] is
a two dimensional array that is 5 elements by 5 elements. We might
access an element like this:  matrix[2][4] = 10;
We can add as many dimensions to an array as we have memory for it:

	four_dimension[100][150][175][200];

Initialize a multi-dimensional array by enclosing each element in
curly braces {}.  char tictac[3][3]; declares a tic-tac-toe board 
and initializes its contents to blanks:

	char tictac[3][3] =
		{
			{' ', ' ', ' ',},
			{' ', ' ', ' ',},
			{' ', ' ', ' ',},
		};
	
To put an 'X' in the middle of the board: tictac[1][1] = 'X';

Look at it like this:   
       0   1   2
   0     |   |
      ---+---+---
   1     | X |
      ---+---+---
   2     |   |

We're ready to start reading numbers now.  Just about every other
textbook out there uses the scanf() function to do this, but Steve
Oualline has a better idea.  He says that scanf() is notorious for
its poor end-of-line handling.  But he knows how to get around that:
we won't use scanf() at all!  Hooray!  Instead, we'll use fgets()
to read a line of input, and use sscanf() to convert the text into
numbers.  This sounds like fun.

We'll use the character variable `line' to read from the keyboard:

	char line[100];  /* Line of keyboard input */

when we want to process input, we use:

	fgets(line, sizeof(line), stdin);
	sscanf(line, _format_, &variable1, &variable2, ...);

Note the ampersand in front of variable1. Don't forget it!
The _format_ is a string similar to the printf() format string.

In this program we use sscanf() to get a number and double it.

	#include <stdio.h>
	int main(void)
	{
		char line[100];
		int value;

		printf("Enter a number: ");
		
		fgets(line, sizeof(line), stdin);
		sscanf(line, "%d", &value);
		
		printf("Twice %d is %d\n", value, value * 2);
		return 0;
	}

I'm going to stop here. I'll finish this later.

Happy Programming!
--
K





More information about the Courses mailing list