|
3. Variables and User Input
Previous | Next Now that you have learned how to write "Masters of the void" onto the screen, and you have probably already tried writing something else between the quotes or duplicating the printf-line, we would like to get more daring. To do this, C has variables. A variable is simply a name into which you can put a value of a specific data type. We already know int, so let's create a variable with this data type. Change your main.c file so main() looks like the following: int main() { int myNumber; myNumber = 7; printf( "I am %d years old.", myNumber );
return 0; } Before we get to the explanation, here's a little movie that illustrates what happens when this program runs: The first line int myNumber; defines a variable named myNumber which may hold data of type int. Defining something basically means you tell your compiler what a certain word is supposed to mean. In this case, you tell the compiler that you want some memory in which you can keep any number, and that whenever you refer to myNumber, you want the compiler to insert whatever you stored in myNumber before. The second line myNumber = 7; now assigns the number 7 to this variable. This is done using the = operator, which writes whatever is to its right into the container to its left. Note that, even though main() and myNumber both have the data type int, main() is not a variable and myNumber is not a function. A function is a list of commands, while a variable is a place to store data. But what does the next line do? printf( "I am %d years old.", myNumber ); Well, printf() doesn't really print the text to the screen just like that, rather, it looks at the text you give it and looks for placeholders. Placeholders always start with a per cent sign ("%") and then have one character after them that indicates what should be inserted here. In our case, that character is "d", which means "decimal number", which means it wants an int. You can also use "%s" to mean "string of characters", i.e. a bit of text. It will replace every such placeholder with a value and then print that to your screen.  Be careful with your placeholders. If you specify the wrong placeholders, or forget one of the values to fill the placeholders, or specify "%s %d" but then pass the number first and the string second, or make other mistakes, the compiler will not notice this. Your program will compile just fine, but when you run it it might print garbage or even crash at that line. So, where does it get the values from? Well, you specify them as additional parameters after your text with placeholders. So if you wanted to provide a number and a name, you could write: printf( "I am %s and I'm %d years old", "Pete", 29 ); Obviously, this would be a little pointless, as you could just write "I am Pete and I'm 29 years old" right away, but when you're using variables this can come in really handy to output whole sentences assembled from data the user entered: If you run the original program (open the console window and do a Build and Run), it writes "I am 7 years old." to the console. So, you see that myNumber is automatically replaced by its value. Neat, huh?Now let's try another neat thing: int main() { int a, b, c; a = b = c = 23; printf( "a = %d, b = %d, c = %d", a, b, c ); return 0; } Note how, in this example, there are three equals signs chained together. Run it, and you will get "a = 23, b = 23, c = 23" on your screen. This comes from the fact that these statements are executed from right to left. That is, first 23 is put into c, then c (which contains 23 now) is put into b and then b (which now also contains 23) into a. Another thing that may catch your eye here is how I defined a, b and c. You can define multiple variables by writing the data type once and then specifying a list of variable names separated by commas. Again, where you insert spaces, newlines and tabs is mandatory, their count isn't. Most programmers put each variable on its own line, but since C couldn't care less about how much whitespace you put between identifiers, you could also write: int a, b, c; Just remember to finish off the definition of a variable with a semicolon (";"). Also, most versions of C require variable definitions to go at the top of a "{ ... }" block, you can't just put them anywhere you want. But now, wouldn't you want to do something more dynamic than just outputting the same text? OK. Let's get started with input from the user. With all you already know, it'll be pretty easy. Change your version of main() again: int main() { int userInput; printf( "Please enter your age: " ); scanf( "%d", &userInput ); fpurge( stdin ); printf( "You are %d years old.\n", userInput ); return 0; } Again, here's a movie of what this will do. Since I can't really show you yet what printf(), scanf() and fpurge() really do internally, I left those out of this animation: First we define an integer variable named userInput. This is the place the data the user entered will go. Then we output some text that tells the user he/she is to enter a number. And now comes the actual part that gets the user input. scanf() is the opposite of printf(), and simply waits until the user has typed something in and pressed the return key on the keyboard. Since scanf() reads, and doesn't write, the placeholders tell scanf() what kind of data to read, and the parameters you pass it are the destination where you want the read data to go. Also note the "&" before the userInput variable. We'll learn why this is necessary later when we do our own parameters. For now, just see it as a quirk that scanf() requires before all its destination parameters. The call to fpurge() makes sure any excess characters entered after the number are discarded, and also tells the system you are finished reading text and will be writing again. stdin is the name of the input stream used by scanf(). Think of it as the name C gives to your keyboard. There's also stdout used by printf() and stderr used to log errors. But you won't need those anytime soon. Finally, to prove that the value arrived properly, we write the variable's value to the screen again. Here you might note some gibberish at the end of the scanf text and the actual text we want to printf: \n. Whenever you encounter a backslash inside some text enclosed in quotes, this means that you want to express some special character inside your text. What character is to be inserted is specified by the next character after the \. In this case it is an n, which means "newline", that is, we tell the compiler to start a new line, just as if we hit the return key on the keyboard. You can also use \t to type a tab, \" to type a quote, and to type a backslash, you use \\ so it knows you really want a backslash and this isn't the start of another special character. Previous | Next Lindsay Cripps writes: Great tutorial.
I'm getting an error coming up along side - fpurge( stdin );
error: 'stdin' undeclared (first use in this function)
Latest 3.1 version of Xcode
|
Uli Kusterer replies: ★ Lindsay, have you checked that all the #include statements are in your code? If you leave one of them out, that will cause the error you mention.
|
Gaby J writes: Hey, I'm starting a project (developing an iPhone app), and I need to learn C first. You guys are one of the only sites that teaches this in "Mac terms", and it's great. Thanks!!!
|
MO writes: I want to write a program to for his/her name, and this what I did:
#include <stdio.h>
int main()
{
int userName;
printf("Please enter your name:");
scanf("%s", &userName);
fpurge(stdin);
printf("\nYour name is %s \n", userName);
return 0;
}
but when I run it, this what happen:
Please enter your name:mohammed
[Session started at 2009-05-14 15:52:09 -0600.]
Loading program into debugger…
GNU gdb 6.3.50-20050815 (Apple version gdb-962) (Sat Jul 26 08:14:40 UTC 2008)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-apple-darwin".Program loaded.
sharedlibrary apply-load-rules all
Attaching to program: `/Users/grey_falkon2003/Documents/first project revised/build/Debug/first project revised', process 894.
kill
The Debugger Debugger is attaching to process
*** I don't know whats wrong!!
|
Uli Kusterer replies: ★ You are using "%s" to tell scanf() to expect a string of text, but then you give it a variable that is declared as an int (which is an integer number). That can't work.
|
zach writes: Let's say I code something where the user can input three numbers, and the c code can calculate them together. Does XCode run this code and open up a little space where the user can input the numbers? I ask this because each time I run my simple c code, it opens a Terminal-esque display. Do I have to run a different compiler if I am writing software c code where the user will need to input data and interact with my software?
Sorry, brand new to c, willing to learn. Just downloaded Xcode, but not sure past the point of the Console running my code in a Terminal like display format.
|
Uli Kusterer replies: ★ zach, that Terminal display is where you enter stuff in Xcode to get it into your running program.
To actually write a graphical user interface, you need to do some additional work (usually involving the use of the Objective C programming language and Cocoa framework). It's just that this would exceed the scope of this tutorial, so I stuck with the Terminal-esque text input/output calls to keep things simple.
But that Terminal-like window Xcode opens should be enough for most uses until you're familiar with C and want to move on to Objective C.
|
Jaxerell writes: I had the same problem/error as Lindsay, with stdin, so I just took the line out, the whole fpurge line.
It worked with a plain number, and when I entered a number AND text, it ignored the text and just used the number. This is what you said that fpurge does, yet it did it without the line.
|
Andrew Hobson writes: Once I compile the project, if I want to quit Xcode and run the program from the "real" MacOS X Terminal, what mst I do?
Where is the final program stored?
How can I execute it?
|
Christian writes: Hello, I am not able to get the second part to run.
scanf( "%d" , &userInput );
fpurge( stdin );
printf( "You are %d years old.\n", userInput );
return 0;
Once I input my age and hit return nothing happens.
Also when I hit build and go a screen pops open and says stop executable... i click ok to continue building and then it runs but I am not sure why it pops open with that warning. It did not do it for the previous programs.
Xcod v3.13
Thanks
Christian
|
Uli Kusterer replies: ★ Christian, you probably didn't open the "Console" window: Choose "Console" from the "Run" menu and you will have a window with your text. Your program was happily running, you just didn't see it. Hence the error message about having to stop the running program before you can start it again.
|
Uli Kusterer replies: ★ Andrew, where the application goes depends on various factors (settings specified in the project and in Xcode's preferences). In a bog-standard Xcode setup, you should see the executable in a "build" folder next to your project file. Usually it is in a "Debug" or "Release" folder in there. Alternately, you can double-click the icon for the generated application in the little brown "Products" folder in the Groups & Files list of your project window to launch it with Terminal.
|
Uli Kusterer replies: ★ Jaxerell, fpurge() is not always needed. The issue is that on some versions of Mac OS and Linux you would need to use this command, while newer versions of Mac OS for example don't need it anymore. But according to the ANSI standard, you have to use fpurge() in this context, so I thought I'd be better safe than sorry.
|
Christian writes: Thank you Uli,
I figured it out. I was also pressing enter on the number pad rather than return on the main keyboard to move the program along.
Thanks for the quick reply.
|
kevin writes: i wrote my program the exact way it is shown here and in the console when i run the program the line saying enter your age appears and i enter a number then press return but nothing happens. only when i type q to quit then press return does the line you are blank years old appear. help?
|
Uli Kusterer replies: ★ MO, one more note: If you want to get text from the user, proceed with this tutorial. We will eventually get around to explaining how to declare a variable that can hold text, and will write a program that lets you type in text.
|
sam writes: Hey there,
Great tutorial but one slight issue, when I have these lines of code in xcode, I get the following warning:
a = b = c = 23;
printf("a = %d", "b = %d", "c = %d",a,b,c);
warning: format '%d' expects type 'int', but argument 2 has type 'char *'
When I run these lines I get this output: a = 3919
|
Uli Kusterer replies: ★ Sam,
the format string is one long string as the first parameter, not three short ones as the first three parameters, so this should be:
printf( "a = %d, b = %d, c = %d", a, b, c );
If you add extra quotes, that means the commas are seen as parameter separators, not as punctuation used inside the text.
|
Charles Marshall writes: This is a great tutorial and a great format for learning. The Comments section not only helps to answer my questions but I'm learning a lot by trying to answer other's before I read your reply! I've always thought learning what causes something to fail helps to reinforce the understanding of how it works. Great Job! Keep up the good work!
|
Rob writes: Great stuff thanks very much....what did you do the graphic part of your quick time clip with?
|
Garotas* writes: Uli, couldn't you add some sound to the movies? I think they are amazing! they look pretty slick and make things really clear. I am surprised that you did them in Keynote!
Please, put some clicking sound on it, or let a computer voice read some text... (or the moose!). I thing that would be cool.
|
Raul writes: Hello, hey I can't use the printf command in the line printf( "I am %d years...
It says: Warning: Incompatible implicit declaration of built-in-function 'printf'
|
RowdyRocket writes: As Christian mentioned above you have to use the return key, the enter key on your numeric keypad will cause it to do nothing.
|
Uli Kusterer replies: ★ The error "Warning: Incompatible implicit declaration of built-in-function 'printf'" means you haven't included the <stdio.h> header, which is where printf() is declared. If you do not declare a function (or include a file that declares it), C just assumes it has certain parameters and return values.
This was useful in the old days, when C did not have declarations. However, declarations have the advantage that the C compiler can notice mistakes (e.g. if you pass parameters in the wrong order) and warn you when it compiles the file, instead of just crashing when you run your program.
|
James Ferner writes: I just want to say how great this site is. I am a complete beginner to programming but just after two sessions I feel encouraged that I can learn. Thank you.
|
Wulf Massell writes: I like your tutorials and would really enjoy seeing the movies. I run 10.6.3 on an Intel Mac and am unable to engage your animations. I have QuickTime Player 7.6.6 Pro, as well as QuickTime Player 10.0. I read that you created these using Keynote. That really interests me and I will distract myself towards creating animations to when I have completed all your tutorials. Thanks - Wulf
|
Saif Sajid writes: This specific page of the tutorial doesn't show up properly. The page expands beyond the screen resolution. Here is a pic of the problem http://i45.tinypic.com/24zkxds.jpg See the scroll bars? I have to scroll around to see the whole thing. hope you fix it. Using a Macbook with 1200x800 resolution
|
Eliot Slevin writes: Im intrigued why of you enter a ridiculously value ten digits or over you get back such a weird age
|
Uli Kusterer replies: ★ Eliot, numbers on the computer have a certain range. So if you go higher or lower than a certain number, you will get wrong results. For example, on your typical Mac, an "int" can hold numbers from a bit under -2 billion to a bit over 2 billion. (The numbers are very odd, because a computer internally uses bits to store a number in binary (base 2), and doesn't store them as base-10 like we humans do on paper, so there's no straight one-to-one mapping in number of digits.
|
Danilo writes: If we tell to compiler than a, b, anc c are "Integer" (int a, b, c;) why later we must put "%d" or anything else?
|
Rapha writes: Hi Uli,
I'm designer rather than programmer, no previous programming knowledge/skills. It's usually a pain for me to learn those things the "dry" way.
I did all the exercise to that point here, works fine. Great!
But than I tried something similar like Mo. You answered "You are using "%s" to tell scanf() to expect a string of text, but then you give it a variable that is declared as an int (which is an integer number). That can't work."
Makes perfect sense. Can you tell us what exactly to do to make that work? that would be helpful.
Thanks!
|
Jayden S. writes: #include <stdio.h>
int main()
{
int userName;
printf("Please enter your name:");
scanf("%s", &userName);
fpurge(stdin);
printf("nYour name is %s n", userName);
return 0;
}
Uli Kusterer replies: ★
You are using "%s" to tell scanf() to expect a string of text, but then you give it a variable that is declared as an int (which is an integer number). That can't work.
so instead of int what do you use??
|
Mike writes: Not sure if this site is still active - I'm writing this on 20 September 2010 - but I thought I'd add an update to the fpurge() issue discussed above. Using Snow Leopard (10.6.4), I tried to run the program without any of the fpurge( stdin ) lines. The program ran once, after which it asked again, "What operation do you want to do?" - but then immediately wrote "Finished." before I could respond. When I added fpurge( stdin ) after the three scanf() lines, the program ran as it should have, and waited for me to respond to the question. So it seems that fpurge( stdin ) is still needed in Snow Leopard.
PS: The Xcode version I'm using is xcode_3.2.3_and_ios_sdk_4.0.2
PPS: This looks like a really useful site - more useful than the C programming book I shelled out for a few weeks ago!
|
Rafael Estrella writes: Every time I try to run I try to run this code I get this window called "MyFirstProgram.xcodeproj". It says "Stop Executable" then within a field says MyFirstProgram, Project:"MyFirstProgram.xcodeproj" Target:"MyFirstProgram". Is this caused by a setting on my app? At first I typed in the code myself, then I copied and pasted your code; same error.
What can I do?
|
Jaime writes: Hi Uli,
I did all that was in the text but when I execute the program I have to put the answer (age) twice before it works. It works fine but just want to be able to answer once before it works.
Thanks
|
SC writes: @MO
Hurr duur.
<code>
#include <stdio.h>
#include <stdlib.h>
int main(){
char *userName = malloc(sizeof(char)*25);
printf("Please enter your name:");
if (scanf("%s", userName))
printf("nYour name is %s n", userName);
return 0;
}
</code>
|
Sofia writes: Just wanted to shout out a big thanks to you for creating this tutorial! I am a complete beginner - never done any programming at all... I want to learn! And this tutorial is great... explanatory, logical, well structured, and the comment section is great for further learning. Thanks!
|
Kolo Rath writes: This site is simply amazing! I think its really great that you took your time in creating a tutorial page directed for mac users, so once again thank you and keep up the great work.
|
Kolo Rath writes: This site is simply amazing! I think its really great that you took your time in creating a tutorial page directed for mac users, so once again thank you and keep up the great work.
|
Kolo Rath writes: Hello Uli,
Dear Uli, i have written the first program on this page just as you have and it runs successfully without errors yet it does not appear on my terminal. Do you have any idea why? please answer
|
Kolo Rath writes: Hello Uli,
Dear Uli, i have written the first program on this page just as you have and it runs successfully without errors yet it does not appear on my terminal. Do you have any idea why? please answer
|
Josh writes: this is the code i tried writing to show to my girlfriend
#include <stdio.h> // Defines printf etc.
int main()
{
char name;
//Write a string of text to the shell window:
printf( "Please enter your name: " );
scanf( "%s", &name );
fpurge( stdin );
printf( "You are %s and Josh loves you <3.n", name );
return 0; // Tell OS everything is OK.
}
and when i run it, it comes up with
Program loaded.
run
[Switching to process 2573]
Running…
Please enter your name: Chelsea
Program received signal: “EXC_BAD_ACCESS”.
sharedlibrary apply-load-rules all
help please?
|
Josh writes: this is the code i tried writing to show to my girlfriend
#include <stdio.h> // Defines printf etc.
int main()
{
char name;
//Write a string of text to the shell window:
printf( "Please enter your name: " );
scanf( "%s", &name );
fpurge( stdin );
printf( "You are %s and Josh loves you <3.n", name );
return 0; // Tell OS everything is OK.
}
and when i run it, it comes up with
Program loaded.
run
[Switching to process 2573]
Running…
Please enter your name: Chelsea
Program received signal: “EXC_BAD_ACCESS”.
sharedlibrary apply-load-rules all
help please?
|
Mike writes: Hi Uli,
Great tutorial.
As Wulf Massell wrote, I too cannot see the movies. Intel iMac, OS 10.6.4, QuickTime Player 10.
Any suggestions?
|
Gabriel writes: I had a problem where it didn't want to build and run. I keep having errors. So I just took fpurge() off seeing that it was only there to remove unwanted characters and i managed to make it work. Why is this??
|
Rolat writes: Well, I'm getting the same error which Lindsay and Jaxerell mentioned. I understood that is not longer needed, but my though is that is not longer needed and has to be eliminated or the program cant be built. Is that right? If it is or even if it's not I would recommend to up-date the chapter with a comentary on this aspect. Thank you very much! Really good tutorial is helping me out :)
|
Zakree writes: Hi, great tutorial and helpful. I am new to C, Xcode and Mac. 'Thank you to the power of many GBytes' for spending your time creating this tutorial for free. I choose to learn C in order to master the objective C. I hope you will start to write on objective C too.. pleaseee.. :)
|
rajesh writes: #include <stdio.h>
int main()
{
int userInput;
printf( "Please enter your age: n" );
scanf( "%d", &userInput );
fpurge( stdin );
printf( "You are %d years old.n", userInput );
return 0;
}
ERROR:::
/tmp/ccqvb1xv.o: In function `main':
masters.c:(.text+0x3b): undefined reference to `fpurge'
collect2: ld returned 1 exit status
root@rajesh-desktop:/home/rajesh/raj# ./a.out
bash: ./a.out: No such file or directory
USING GCC::
what is wrong with is code ?
what exactly the fpurge will do ?
when we need to apply fpurge (is it compulsory to use)?
|
Udit Bhansali writes: Why do I need to add the printf code again for the 2nd time after fpurge(stdin);?
Is it really necessary?
1 quick question
If we are creating a form then do we need to use the printf code again for the 2nd time?
The presentation shows that you use the printf code 2nd time to show the age. It'l like answering the question.
|
John writes: I get a "You are &d years old" ??
after simply copying your code
|
A Samuel W B writes: Dear Uli,
Great Tutorial. Only point where i could not make head way is
int main()
{
int userName;
printf("Please enter your name:");
scanf("%s", &userName);
fpurge(stdin);
printf("nYour name is %s n", userName);
return 0;
}
Uli Kusterer replies: ★
You are using "%s" to tell scanf() to expect a string of text, but then you give it a variable that is declared as an int (which is an integer number). That can't work.
so instead of int what do you use?? KIndly let me know.
|
claudio ccapa writes: Great Course. It is excellent for everyone who want to learn! I have a curiosity about graphics and movies that you show in this article. How do you did that movies (animated graphics)?
Cheers,
Claudio
|
Mike Hogan writes: Uli:
Thanks for your stuff. It's fascinating. I just hit a problem with 3 Variables and user input, as follows:
Debugger Console message as follows but with warning in build results, copied at end below:
int main()
{
int myNumber;
myNumber = 7;
printf( "I am %d years old.", myNumber );
return 0;
[Session started at 2012-02-26 11:20:28 +0000.]
GNU gdb 6.3.50-20050815 (Apple version gdb-1515) (Sat Jan 15 08:33:48 UTC 2011)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin".tty /dev/ttys001
Loading program into debugger…
Program loaded.
run
[Switching to process 17831]
Running…
I am 7 years old.
Debugger stopped.
Program exited with status value:0.
warning: no rule to process file '$(PROJECT_DIR)/Mysecondprogramme' of type text for architecture x86_64
Would be grateful for yr comments |
|
Home | Admin | Edit
Last Change: 2012-05-17 @314, © 2003-2012 by M. Uli Kusterer, all rights reserved. |
|
|