Difference between revisions of "ES101 - Lesson 3 : scanf"

From Embedded Systems Learning Academy
Jump to: navigation, search
(Assignment)
 
(scanf)
Line 19: Line 19:
 
The & (ampersand) symbol is needed because it is called the address operator. Instead of passing the variable's value, you pass the variable's address such that scanf can input the data into the memory location given by the variable's address. If you forget to include the & operator, you will experience unexpected results because '''scanf''' would probably input the data at the wrong memory location.
 
The & (ampersand) symbol is needed because it is called the address operator. Instead of passing the variable's value, you pass the variable's address such that scanf can input the data into the memory location given by the variable's address. If you forget to include the & operator, you will experience unexpected results because '''scanf''' would probably input the data at the wrong memory location.
  
'''scanf''' should be intuitive to understand except when you try to scanf a single character (%c). Since the intention is to collect a single keyboard character, care needs to be taken. The Enter key itself is a character in the ASCII table, and a previous '''scanf''' does not consume the Enter key character, and this character is hanging in the keyboard buffer. As a result, it will not give a chance for the user to enter a character for the last scanf since the my_char will be set equal to this Enter key character. So, a call to getchar() is made, which discards this unconsumed hanging character, such that the user is allowed to input a new character from the keyboard.
+
'''scanf''' should be intuitive to understand except when you try to scanf a single character (%c). What happens is that a previous '''scanf''' does not consume the <Enter key> character (0x0A) and the next '''scanf''' picks up this character when you try to use: <code>scanf("%c", &my_char);</code>.  To solve this problem a call to getchar() is made, which discards this unconsumed hanging character, and '''scanf''' will wait for a new character from '''Hercules''' terminal.
 +
 
  
 
<syntaxhighlight lang="c">
 
<syntaxhighlight lang="c">
Line 39: Line 40:
  
 
<br/>
 
<br/>
 +
 
== Assignment ==
 
== Assignment ==
 
To provide input to your Board from your computer's PC, you need to open Hercules Program at 38400bps by going to the Serial Tab. Then, you need to open the COM Port and right click anywhere on the middle of the screen and turn on Local Echo. Finally, you can simply type on the screen and hit the Enter key to enter text from your keyboard, which will be transmitted to the Board. Also note that after you open the COM Port in Hercules, the reset button should be pressed on the Board to restart the program.
 
To provide input to your Board from your computer's PC, you need to open Hercules Program at 38400bps by going to the Serial Tab. Then, you need to open the COM Port and right click anywhere on the middle of the screen and turn on Local Echo. Finally, you can simply type on the screen and hit the Enter key to enter text from your keyboard, which will be transmitted to the Board. Also note that after you open the COM Port in Hercules, the reset button should be pressed on the Board to restart the program.

Revision as of 18:10, 17 September 2012

scanf

The scanf function can be used to input information to your program variables. Using the Embedded Board, you will input the data in Hercules that will be captured by your processor. scanf syntax is similar to printf, except that it is not used to output, but for input. The specifier list is the same, and one or more inputs can be captured similarly to how you use printf. See below for some examples:

int age;
float height;

printf("What is your age? ");
scanf("%i", &age);

printf("What is your height? ");
scanf("%f", &height);

Notice the following differences and similarities of scanf vs.printf

  • scanf uses same specifiers,%i,%f etc.
  • scanf variables after the double quotes have & symbol.

The & (ampersand) symbol is needed because it is called the address operator. Instead of passing the variable's value, you pass the variable's address such that scanf can input the data into the memory location given by the variable's address. If you forget to include the & operator, you will experience unexpected results because scanf would probably input the data at the wrong memory location.

scanf should be intuitive to understand except when you try to scanf a single character (%c). What happens is that a previous scanf does not consume the <Enter key> character (0x0A) and the next scanf picks up this character when you try to use: scanf("%c", &my_char);. To solve this problem a call to getchar() is made, which discards this unconsumed hanging character, and scanf will wait for a new character from Hercules terminal.


int age;
char my_char;

printf("What is your age? ");
scanf("%i", &age);

/** 
 * This code will not function unless you insert:
 * getchar(); before the next scanf() statement
 */
printf("Press any key: ");
scanf("%c", &my_char);

printf("You entered: %c which is the number %u\n", my_char, my_char);


Assignment

To provide input to your Board from your computer's PC, you need to open Hercules Program at 38400bps by going to the Serial Tab. Then, you need to open the COM Port and right click anywhere on the middle of the screen and turn on Local Echo. Finally, you can simply type on the screen and hit the Enter key to enter text from your keyboard, which will be transmitted to the Board. Also note that after you open the COM Port in Hercules, the reset button should be pressed on the Board to restart the program.

  1. Declare four variables and choose their appropriate type, such as int, or float. Use a meaningful name based on the following uses:
    • A variable to store the age (in years) of the user
    • A variable to store the age in months.
    • A variable to store the height in inches of the user.
    • A variable to store the height in centimeters.
  2. Ask the user to input their age in years and store it to your age variable.
  3. Ask the user to input their height and store it to your height variable in inches.
  4. Calculate the age in months and store it to the appropriate variable.
  5. Calculate the height in centimeters (2.54 cm per inch) and store it to the appropriate variable.
  6. Output the user's age in months and years, height in inches, and height in centimeters.
    • The height in centimeters should only display 2 decimal digits.

Questions

  • After completing the assignment, try removing & symbol for the scanf statement that asks for user's height.
    What is the program output? Does it work as expected?
  • Try getting a single character at the end of your program and simply output what the user inputs.
    Does the program work as expected?