[Courses] C Programming For Absolute Beginners, Lesson 2: Fun With Printf, Scanf, Puts, and Variables

Femke Snelting snelting at collectifs.net
Sun Feb 26 19:29:13 UTC 2012


Homework finally done + a late thank you for responding to the question I had about lesson 1.  All clear now!

Out of curiosity: If I give the program some wrong input, like 'no thanks' for example, it jumps to conclusions:

The program:
===
#include <stdio.h>

int main()
{
     int a, b, c;
      
     puts( "Please enter any number up to three digits:" );
     scanf( "%d", &a );
     printf( "You entered %d. Now enter another number up to three digits:\n", a );
     scanf( "%d", &b );
     c = a + b;
     printf("%d + %d = %d\n", a, b, c);

     return 0;
}
===

The output:
===
Please enter any number up to three digits:
no thanks
You entered -1216996267. Now enter another number up to three digits:
-1216996267 + 134513929 = -1082482338
===

Why does the program not wait for the second user-input when the first is of the wrong type?
How does the program decide 'b' is 134513929 (it is always the same)?

Femke

On 02/21/2012 05:26 AM, Carla Schroder wrote:
> =========
> C Programming For Absolute Beginners, Lesson 2: Fun With Printf, Scanf, Puts,
> and Variables
> =========
>
> Allrighty then, in Lesson One we learned some basics of using gcc, the
> simplest structure of a C program, and some Linux tips for coders. Today we're
> going to continue with our simple example program and build on it, and learn
> how to make an interactive program that asks for user input and then does
> something with it.
>
> Please remember there are no stupid questions-- the whole point of this is to
> learn, so ask!
>
> ## Fun With Printf ##
>
> Printf is a fundamental C function, and it does all kinds of cool and useful
> things, so let's make it do stuff. We'll take our Lesson 1 example program and
> play some printf tricks with it. This example does multiple-line output:
>
> /*
>     printfex (printf example); a simple example
>     of how printf works
> */
>
> #include<stdio.h>
> void main()
> {
>    printf( "Hello, and welcome to the Beginning C Course!\n" );
>    printf( "Look, we can do a second line.\n" );
>    printf( "And a third line.\n");
>    printf( "And a fourth.\n");
> }
>
> Remember to not use reserved words or existing command names for your source
> files and programs, or *fun confusion will result. (*May not be actually fun.)
>
> ****
> Side note: A syntax-highlighting text editor will save you a lot of typos. For
> example, I never remember where to put the line break, \n, and my editor helps
> me with this by telling me when it's in the wrong place by changing the color.
> ****
>
> Then compile and run it:
>
> $ gcc -o printfex printfex.c
>
> I copy my executables into a separate directory that I have put in my PATH;
> please review part 1 to learn how to do this.
>
> $ printfex
> Hello, and welcome to the Beginning C Course!
> Look, we can do a second line.
> And a third line.
> And a fourth.
>
> You can also do it this way:
>
> #include<stdio.h>
> int main()
> {
>    printf( "Hello, and welcome to the Beginning C Course!\n" "Look, we can do a
> second line.\n" "And a third line.\n" "And a fourth.\n");
>
>    return 0;
> }
>
> Or like this:
>
> #include<stdio.h>
> int main()
> {
>    printf( "Hello, and welcome to the Beginning C Course!\n"
>    "Look, we can do a second line.\n"
>    "And a third line.\n"
>    "And a fourth.\n");
>
>    return 0;
> }
>
> We don't even have to use printf, but can use the puts function instead, which
> automatically inserts a line break:
>
> #include<stdio.h>
> int main()
> {
>    puts( "Hello, and welcome to the Beginning C Course!" );
>    puts( "Look, we can do a second line." );
>    puts( "And a third line." );
>    puts( "And a fourth.");
>
>    return 0;
> }
>
> puts does one thing: print output followed by a line break. Let's make an
> interactive program to demonstrate puts:
>
> /*
>     age; an example program showing
>     the difference between puts and printf
> */
>
> #include<stdio.h>
>
> int main()
> {
>      int age;
>
>      puts( "Please enter your age: " );
>      scanf( "%d",&age );
>      printf( "Wow, you are %d years old.\n", age);
>
>      return 0;
> }
>
> The output of this is nicely-formatted:
>
> $ age
> Please enter your age:
> 80
> Wow, you are 80 years old.
>
> There are a number of cool things happening in this tiny program: it asks for
> input, we enter something, and then it uses it correctly in a sentence. The
> scanf function scans and formats input, and printf formats output.  %d is a
> placeholder, and it means scan an integer as a signed decimal number. A signed
> integer can be either a negative or positive number; an unsigned integer is
> only positive.
>
> scanf( "%d",&age ); means "read the user input and place that value into the
> variable age." You must use the&  symbol in front of your variable or it won't
> work. If you want to jump ahead this is your introduction to using pointers,
> which is pointing to a specific location on memory. Pointers is a weird and
> complicated subject to explain, so for now I'm going to leave it at "don't
> forget the&  symbol when you're playing with scanf." (Anyone who wants to
> chime in with their own explanation of pointers is welcome!)
>
> scanf has already assigned the value of the user input to our age variable, so
> all printf has to do is display it.
>
> Some other commonly-used scanf and printf placeholders are:
>
>      %f -- float
>      %c -- single character
>      %s -- character strings
>      %i -- signed integer, or hexadecimal when preceded by 0x and octal when
> preceded by 0
>
> scanf is pretty simple and doesn't handle input errors very well. You can see
> for yourself by typing wrong input on purpose, such as letters and punctuation
> marks. In real life you'll use other functions, for example gets and fgets,
> which we will cover later in this course.
>
> This example shows how to handle multiple variables with printf:
>
> /* addition; an example of adding and displaying user input */
>
> #include<stdio.h>
>
> int main()
> {
>      int a, b, c;
>
>      puts( "Please enter any number up to three digits: " );
>      scanf( "%d",&a );
>      puts( "Please enter another number up to three digits: " );
>      scanf( "%d",&b );
>      c = a + b;
>      printf("%d + %d = %d\n", a, b, c);
>
>      return 0;
> }
>
> When you run it it looks like this:
>
> $ addition
> Please enter any number up to three digits:
> 34
> Please enter another number up to three digits:
> 567
> 34 + 567 = 601
>
> Note how the order of each variable is managed-- if you change the order of a,
> b, c on the last printf line then you change the results.
>
> I'm afraid I must stop here; we'll be back on track next Sunday with a nice
> long lesson.
>
> Homework: Modify the addition program to echo the user input as it is entered,
> so it looks something like this:
>
> "Please enter any number up to three digits:
> 34
> You entered the number 34. Now please enter another number:"
>
> You can also play around with the inputs and do different math operations.
>
> Discussion: Perhaps someone could offer some thoughts on puts vs. printf, and
> what are some real-world functions to use in place of scanf?
>


More information about the Courses mailing list