Programming Language
Programming Language
C
PROGRAMMING LANGUAGE
1
C HOME C Intro
C Get Started C Syntax
C Output C Comments
C Variables C Data Types
C Constants C Operators
C Booleans C If...Else
C Switch C While Loop
C For Loop C Break/Continue
C Arrays C Strings
C User Input C Memory Address
C Pointers
C Functions
C Function Parameters C Function Declaration
C Recursion C Math Functions
C Structures
C Structures
C Enums
C Enums
2
Learn C
C is a general-purpose programming language, developed in 1972, and still
quite popular.
C is very powerful; it has been used to develop operating systems,
databases, applications, etc.
int main() {
printf("Hello World!");
return 0;
}
C Introduction
What is C?
C is a general-purpose programming language created by Dennis Ritchie at
the Bell Laboratories in 1972.
It is a very popular language, despite being old.
C is strongly associated with UNIX, as it was developed to write the UNIX
operating system.
Why Learn C?
It is one of the most popular programming language in the world
If you know C, you will have no problem learning other popular
programming languages such as Java, Python, C++, C#, etc, as the
syntax is similar
C is very fast, compared to other programming languages,
like Java and Python
C is very versatile; it can be used in both applications and technologies
3
Get Started
This tutorial will teach you the very basics of C.
It is not necessary to have any prior programming experience.
C Get Started
Get Started With C
To start using C, you need two things:
There are many text editors and compilers to choose from. In this tutorial,
we will use an IDE (see below).
C Install IDE
An IDE (Integrated Development Environment) is used to edit AND compile
the code.
Popular IDE's include Code::Blocks, Eclipse, and Visual Studio. These are all
free, and they can be used to both edit and debug C code.
C Quickstart
Let's create our first C file.
Open Codeblocks and go to File > New > Empty File.
Write the following C code and save the file as myfirstprogram.c (File >
Save File as):
4
myfirstprogram.c
#include <stdio.h>
int main() {
printf("Hello World!");
return 0;
}
Congratulations! You have now written and executed your first C program.
myfirstprogram.c
Code:
#include <stdio.h>
int main() {
printf("Hello World!");
return 0;
}
Result:
Hello World!
C Syntax
Syntax
You have already seen the following code a couple of times in the first
chapters. Let's break it down to understand it better:
Example
#include <stdio.h>
int main() {
printf("Hello World!");
return 0;
}
Example explained
Line 1: #include <stdio.h> is a header file library that lets us work with
input and output functions, such as printf() (used in line 4). Header files
add functionality to C programs.
5
Don't worry if you don't understand how #include <stdio.h> works. Just
think of it as something that (almost) always appears in your program.
Line 2: A blank line. C ignores white space. But we use it to make the code
more readable.
Line 3: Another thing that always appear in a C program, is main(). This is
called a function. Any code inside its curly brackets {} will be executed.
Line 4: printf() is a function used to output/print text to the screen. In
our example it will output "Hello World".
Note that: Every C statement ends with a semicolon ;
Note: The body of int main() could also been written as:
int main(){printf("Hello World!");return 0;}
Remember: The compiler ignores white spaces. However, multiple lines
makes the code more readable.
Line 5: return 0 ends the main() function.
Line 6: Do not forget to add the closing curly bracket } to actually end the
main function.
Example
#include <stdio.h>
int main() {
printf("Hello World!");
return 0;
}
You can use as many printf() functions as you want. However, note that it
does not insert a new line at the end of the output:
Example
#include <stdio.h>
int main() {
printf("Hello World!");
printf("I am learning C.");
return 0;
}
6
C New Lines
New Lines
To insert a new line, you can use the \n character:
Example
#include <stdio.h>
int main() {
printf("Hello World!\n");
printf("I am learning C.");
return 0;
}
You can also output multiple lines with a single printf() function. However,
be aware that this will make the code harder to read:
Example
#include <stdio.h>
int main() {
printf("Hello World!\nI am learning C.\nAnd it is awesome!");
return 0;
}
Tip: Two \n characters after each other will create a blank line:
Example
#include <stdio.h>
int main() {
printf("Hello World!\n\n");
printf("I am learning C.");
return 0;
}
What is \n exactly?
The newline character (\n) is called an escape sequence, and it forces the
cursor to change its position to the beginning of the next line on the screen.
This results in a new line.
7
Escape Sequence Description
C Comments
Comments in C
Comments can be used to explain code, and to make it more readable. It can
also be used to prevent execution when testing alternative code.
Single-line Comments
Single-line comments start with two forward slashes ( //).
Any text between // and the end of the line is ignored by the compiler (will
not be executed).
Example
// This is a comment
printf("Hello World!");
Example
printf("Hello World!"); // This is a comment
8
C Multi-line Comments
Multi-line comments start with /* and ends with */.
Any text between /* and */ will be ignored by the compiler:
Example
/* The code below will print the words Hello World!
to the screen, and it is amazing */
printf("Hello World!");
Good to know: Before version C99 (released in 1999), you could only use
multi-line comments in C.
C Variables
Variables are containers for storing data values, like numbers and characters.
In C, there are different types of variables (defined with different keywords),
for example:
Syntax
type variableName = value;
Where type is one of C types (such as int), and variableName is the name of
the variable (such as x or myName). The equal sign is used to assign a
value to the variable.
So, to create a variable that should store a number, look at the following
example:
9
Example
Create a variable called myNum of type int and assign the value 15 to it:
You can also declare a variable without assigning the value, and assign the
value later:
Example
// Declare a variable
int myNum;
Output Variables
You learned from the output chapter that you can output values/print text
with the printf() function:
Example
printf("Hello World!");
In many other programming languages (like Python, Java, and C++), you
would normally use a print function to display the value of a variable.
However, this is not possible in C:
Example
int myNum = 15;
printf(myNum); // Nothing happens
To output variables in C, you must get familiar with something called "format
specifiers".
Format Specifiers
Format specifiers are used together with the printf() function to tell the
compiler what type of data the variable is storing. It is basically a placeholder
for the variable value.
For example, to output the value of an int variable, you must use the format
specifier %d or %i surrounded by double quotes, inside the printf() function:
10
Example
int myNum = 15;
printf("%d", myNum); // Outputs 15
// Print variables
printf("%d\n", myNum);
printf("%f\n", myFloatNum);
printf("%c\n", myLetter);
To combine both text and a variable, separate them with a comma inside
the printf() function:
Example
int myNum = 15;
printf("My favorite number is: %d", myNum);
To print different types in a single printf() function, you can use the
following:
Example
int myNum = 15;
char myLetter = 'D';
printf("My number is %d and my letter is %c", myNum, myLetter);
You will learn more about Data Types in the next chapter.
Example
int myNum = 15; // myNum is 15
myNum = 10; // Now myNum is 10
11
Example
int myNum = 15;
Example
// Create a variable and assign the value 15 to it
int myNum = 15;
// Declare a variable without assigning it a value
int myOtherNum;
// Assign the value of myNum to myOtherNum
myOtherNum = myNum;
// myOtherNum now has 15 as a value
printf("%d", myOtherNum);
Example
int x = 5, y = 6, z = 50;
printf("%d", x + y + z);
You can also assign the same value to multiple variables of the same type:
12
Example
int x, y, z;
x = y = z = 50;
printf("%d", x + y + z);
C Variable Names
All C variables must be identified with unique names.
Example
// Good
int minutesPerHour = 60;
You can also assign the same value to multiple variables of the same type:
Real-Life Example
Often in our examples, we tend to simplify variable names to match their
data type (myInt or myNum for int types, myChar for char types etc). This is
done to avoid confusion.
However, if you want a real-life example on how variables can be used, take
a look at the following, where we have made a program that stores different
data of a college student:
13
Example
// Student data
int studentID = 15;
int studentAge = 23;
float studentFee = 75.25;
char studentGrade = 'B';
// Print variables
printf("Student id: %d\n", studentID);
printf("Student age: %d\n", studentAge);
printf("Student fee: %f\n", studentFee);
printf("Student grade: %c", studentGrade);
C Data Types
Data Types
As explained in the Variables chapter, a variable in C must be a
specified data type, and you must use a format specifier inside
the printf() function to display it:
Example
// Create variables
int myNum = 5; // Integer (whole number)
float myFloatNum = 5.99; // Floating point number
char myLetter = 'D'; // Character
// Print variables
printf("%d\n", myNum);
printf("%f\n", myFloatNum);
printf("%c\n", myLetter);
14
Int 2 or 4 bytes Stores whole numbers, without decimals
Float 4 bytes Stores fractional numbers, containing one or more decimals. Sufficient for storing 6-7
decimal digits
Double 8 bytes Stores fractional numbers, containing one or more decimals. Sufficient for storing 15
decimal digits
%d or %i Int
%f Float
%lf Double
%c Char
%s Used for strings (text), which you will learn more about in a
later chapter
There are different format specifiers for each data type. Here are some of
them:
15
Example
float myFloatNum = 3.5;
double myDoubleNum = 19.99;
If you want to remove the extra zeros (set decimal precision), you can use a
dot (.) followed by a number that specifies how many digits that should be
shown after the decimal point:
Example
float myFloatNum = 3.5;
C Type Conversion
Type Conversion
Sometimes, you have to convert the value of one data type to another type.
This is known as type conversion.
For example, if you try to divide two integers, 5 by 2, you would expect the
result to be 2.5. But since we are working with integers (and not floating-
point values), the following example will just output 2:
Example
int x = 5;
int y = 2;
int sum = 5 / 2;
To get the right result, you need to know how type conversion works.
16
Implicit Conversion (automatically)
Explicit Conversion (manually)
Implicit Conversion
Implicit conversion is done automatically by the compiler when you assign a
value of one type to another.
Example
// Automatic conversion: int to float
float myFloat = 9;
As you can see, the compiler automatically converts the int value 9 to a float
value of 9.000000.
This can be risky, as you might lose control over specific values in certain
situations.
Example
// Automatic conversion: float to int
int myInt = 9.99;
printf("%d", myInt); // 9
As another example, if you divide two integers: 5 by 2, you know that the
sum is 2.5. And as you know from the beginning of this page, if you store the
sum as an integer, the result will only display the number 2. Therefore, it
would be better to store the sum as a float or a double, right?
Example
float sum = 5 / 2;
17
Why is the result 2.00000 and not 2.5? Well, it is because 5 and 2 are still
integers in the division. In this case, you need to manually convert the
integer values to floating-point values. (see below).
Explicit Conversion
Explicit conversion is done manually by placing the type in parentheses () in
front of the value.
Considering our problem from the example above, we can now get the right
result:
Example
// Manual conversion: int to float
float sum = (float) 5 / 2;
Example
int num1 = 5;
int num2 = 2;
float sum = (float) num1 / num2;
And since you learned about "decimal precision" in the previous chapter, you
could make the output even cleaner by removing the extra zeros (if you
like):
Example
int num1 = 5;
int num2 = 2;
float sum = (float) num1 / num2;
C Constants
Constants
If you don't want others (or yourself) to change existing variable values, you
can use the const keyword.
18
This will declare the variable as "constant", which
means unchangeable and read-only:
Example
const int myNum = 15; // myNum will always be 15
myNum = 10; // error: assignment of read-only variable 'myNum'
You should always declare the variable as constant when you have values
that are unlikely to change:
Example
const int minutesPerHour = 60;
const float PI = 3.14;
Notes On Constants
When you declare a constant variable, it must be assigned with a value:
Example
Like this:
const int minutesPerHour = 60;
Example
const int BIRTHYEAR = 1980;
C Operators
Operators
Operators are used to perform operations on variables and values.
In the example below, we use the + operator to add together two values:
19
Example
int myNum = 100 + 50;
Although the + operator is often used to add together two values, like in the
example above, it can also be used to add together a variable and a value, or
a variable and another variable:
Example
int sum1 = 100 + 50; // 150 (100 + 50)
int sum2 = sum1 + 250; // 400 (150 + 250)
int sum3 = sum2 + sum2; // 800 (400 + 400)
Arithmetic operators
Assignment operators
Comparison operators
Logical operators
Bitwise operators
Arithmetic Operators
Arithmetic operators are used to perform common mathematical operations.
Assignment Operators
Assignment operators are used to assign values to variables.
In the example below, we use the assignment operator (=) to assign the
value 10 to a variable called x:
20
Example
int x = 10;
Example
int x = 10;
x += 5;
= x=5 x=5
+= x += 3 x=x+3
-= x -= 3 x=x–3
*= x *= 3 x=x*3
/= x /= 3 x=x/3
%= x %= 3 x=x%3
|= x |= 3 x=x|3
^= x ^= 3 x=x^3
Comparison Operators
Comparison operators are used to compare two values (or variables). This is
important in programming, because it helps us to find answers and make
decisions.
21
The return value of a comparison is either 1 or 0, which means true (1)
or false (0). These values are known as Boolean values, and you will learn
more about them in the Booleans and If..Else chapter.
In the following example, we use the greater than operator (>) to find out if
5 is greater than 3:
Example
int x = 5;
int y = 3;
printf("%d", x > y); // returns 1 (true) because 5 is greater than 3
== Equal to x == y
!= Not equal x != y
Logical Operators
You can also test for true or false values with logical operators.
&& Logical and Returns true if both statements are true x < 5 && x < 10
22
! Logical not Reverse the result, returns false if the result is true !(x < 5 && x < 10)
Sizeof Operator
The memory size (in bytes) of a data type or a variable can be found with
the sizeof operator:
Example
int myInt;
float myFloat;
double myDouble;
char myChar;
printf("%lu\n", sizeof(myInt));
printf("%lu\n", sizeof(myFloat));
printf("%lu\n", sizeof(myDouble));
printf("%lu\n", sizeof(myChar));
Note that we use the %lu format specifer to print the result, instead of %d. It is
because the compiler expects the sizeof operator to return a long unsigned
int (%lu), instead of int (%d). On some computers it might work with %d, but it
is safer to use %lu.
C Booleans
Boolean
Very often, in programming, you will need a data type that can only have
one of two values, like:
YES / NO
ON / OFF
TRUE / FALSE
Boolean Variables
In C, the bool type is not a built-in data type, like int or char.
It was introduced in C99, and you must import the following header file to
use it:
23
#include <stdbool.h>
A boolean variable is declared with the bool keyword and can only take the
values true or false:
bool isProgrammingFun = true;
bool isFishTasty = false;
Before trying to print the boolean variables, you should know that boolean
values are returned as integers:
Therefore, you must use the %d format specifier to print a boolean value:
Example
// Create boolean variables
bool isProgrammingFun = true;
bool isFishTasty = false;
// Return boolean values
printf("%d", isProgrammingFun); // Returns 1 (true)
printf("%d", isFishTasty); // Returns 0 (false)
For example, you can use a comparison operator, such as the greater
than (>) operator, to compare two values:
Example
printf("%d", 10 > 9); // Returns 1 (true) because 10 is greater than 9
From the example above, you can see that the return value is a boolean
value.
You can also compare two variables:
Example
int x = 10;
int y = 9;
printf("%d", x > y);
24
In the example below, we use the equal to (==) operator to compare
different values:
Example
printf("%d", 10 == 10); // Returns 1 (true), because 10 is equal to 10
printf("%d", 10 == 15); // Returns 0 (false), because 10 is not equal
to 15
printf("%d", 5 == 55); // Returns 0 (false) because 5 is not equal to
55
You are not limited to only compare numbers. You can also compare boolean
variables, or even special structures, like arrays (which you will learn more
about in a later chapter):
Example
bool isHamburgerTasty = true;
bool isPizzaTasty = true;
In the example below, we use the >= comparison operator to find out if the
age (25) is greater than OR equal to the voting age limit, which is set to 18:
Example
int myAge = 25;
int votingAge = 18;
Cool, right? An even better approach (since we are on a roll now), would be
to wrap the code above in an if...else statement, so we can perform
different actions depending on the result:
Example
25
Output "Old enough to vote!" if myAge is greater than or equal to 18.
Otherwise output "Not old enough to vote.":
You will learn more about conditions (if...else) in the next chapter.
C If ... Else
Conditions and If Statements
You have already learned that C supports the usual logical conditions from
mathematics:
You can use these conditions to perform different actions for different
decisions.
C has the following conditional statements:
The if Statement
Use the if statement to specify a block of code to be executed if a condition
is true.
26
Syntax
if (condition) {
// block of code to be executed if the condition is true
}
Note that if is in lowercase letters. Uppercase letters (If or IF) will generate
an error.
In the example below, we test two values to find out if 20 is greater than 18.
If the condition is true, print some text:
Example
if (20 > 18) {
printf("20 is greater than 18");
}
Example explained
In the example above we use two variables, x and y, to test whether x is
greater than y (using the > operator). As x is 20, and y is 18, and we know
that 20 is greater than 18, we print to the screen that "x is greater than y".
Syntax
if (condition) {
// block of code to be executed if the condition is true
} else {
// block of code to be executed if the condition is false
}
Example
int time = 20;
if (time < 18) {
printf("Good day.");
27
} else {
printf("Good evening.");
}
// Outputs "Good evening."
Example explained
In the example above, time (20) is greater than 18, so the condition
is false. Because of this, we move on to the else condition and print to the
screen "Good evening". If the time was less than 18, the program would
print "Good day".
Syntax
if (condition1) {
// block of code to be executed if condition1 is true
} else if (condition2) {
// block of code to be executed if the condition1 is false and
condition2 is true
} else {
// block of code to be executed if the condition1 is false and
condition2 is false
}
Example
int time = 22;
if (time < 10) {
printf("Good morning.");
} else if (time < 20) {
printf("Good day.");
} else {
printf("Good evening.");
}
// Outputs "Good evening."
Example explained
In the example above, time (22) is greater than 10, so the first
condition is false. The next condition, in the else if statement, is
also false, so we move on to the else condition
28
since condition1 and condition2 is both false - and print to the screen
"Good evening".
However, if the time was 14, our program would print "Good day."
Another Example
This example shows how you can use if..else to find out if a number is
positive or negative:
Example
int myNum = 10; // Is this a positive or negative number?
if (myNum > 0) {
printf("The value is a positive number.");
} else if (myNum < 0) {
printf("The value is a negative number.");
} else {
printf("The value is 0.");
}
Syntax
variable = (condition) ? expressionTrue : expressionFalse;
Instead of writing:
Example
int time = 20;
if (time < 18) {
printf("Good day.");
29
} else {
printf("Good evening.");
}
You can simply write:
Example
int time = 20;
(time < 18) ? printf("Good day.") : printf("Good evening.");
It is completely up to you if you want to use the traditional if...else
statement or the ternary operator.
C Switch
Switch Statement
Instead of writing many if..else statements, you can use
the switch statement.
The switch statement selects one of many code blocks to be executed:
Syntax
switch(expression) {
case x:
// code block
break;
case y:
// code block
break;
default:
// code block
}
This is how it works:
The example below uses the weekday number to calculate the weekday
name:
Example
int day = 4;
30
switch (day) {
case 1:
printf("Monday");
break;
case 2:
printf("Tuesday");
break;
case 3:
printf("Wednesday");
break;
case 4:
printf("Thursday");
break;
case 5:
printf("Friday");
break;
case 6:
printf("Saturday");
break;
case 7:
printf("Sunday");
break;
}
This will stop the execution of more code and case testing inside the block.
When a match is found, and the job is done, it's time for a break. There is no
need for more testing.
A break can save a lot of execution time because it "ignores" the execution of
all the rest of the code in the switch block.
31
case 6:
printf("Today is Saturday");
break;
case 7:
printf("Today is Sunday");
break;
default:
printf("Looking forward to the Weekend");
}
// Outputs "Looking forward to the Weekend"
Note: The default keyword must be used as the last statement in the switch,
and it does not need a break.
C While Loop
Loops
Loops can execute a block of code as long as a specified condition is reached.
Loops are handy because they save time, reduce errors, and they make code
more readable.
While Loop
The while loop loops through a block of code as long as a specified condition
is true:
Syntax
while (condition) {
// code block to be executed
}
In the example below, the code in the loop will run, over and over again, as
long as a variable (i) is less than 5:
Example
int i = 0;
while (i < 5) {
printf("%d\n", i);
i++;
}
Note: Do not forget to increase the variable used in the condition ( i++),
otherwise the loop will never end!
32
block once, before checking if the condition is true, then it will repeat the
loop as long as the condition is true.
Syntax
do {
// code block to be executed
}
while (condition);
The example below uses a do/while loop. The loop will always be executed at
least once, even if the condition is false, because the code block is executed
before the condition is tested:
Example
int i = 0;
do {
printf("%d\n", i);
i++;
}
while (i < 5);
Do not forget to increase the variable used in the condition, otherwise the
loop will never end!
C For Loop
For Loop
When you know exactly how many times you want to loop through a block of
code, use the for loop instead of a while loop:
Syntax
for (statement 1; statement 2; statement 3) {
// code block to be executed
}
Statement 1 is executed (one time) before the execution of the code block.
33
Statement 3 is executed (every time) after the code block has been
executed.
The example below will print the numbers 0 to 4:
Example
int i;
Example explained
Statement 2 defines the condition for the loop to run (i must be less than 5).
If the condition is true, the loop will start over again, if it is false, the loop
will end.
Statement 3 increases a value (i++) each time the code block in the loop has
been executed.
Another Example
This example will only print even values between 0 and 10:
Example
for (i = 0; i <= 10; i = i + 2) {
printf("%d\n", i);
}
Nested Loops
It is also possible to place a loop inside another loop. This is called a nested
loop.
The "inner loop" will be executed one time for each iteration of the "outer
loop":
Example
int i, j;
// Outer loop
34
for (i = 1; i <= 2; ++i) {
printf("Outer: %d\n", i); // Executes 2 times
// Inner loop
for (j = 1; j <= 3; ++j) {
printf(" Inner: %d\n", j); // Executes 6 times (2 * 3)
}
}
Example
int i;
Continue
The continue statement breaks one iteration (in the loop), if a specified
condition occurs, and continues with the next iteration in the loop.
Example
int i;
35
if (i == 4) {
continue;
}
printf("%d\n", i);
}
Break Example
int i = 0;
Continue Example
int i = 0;
C Arrays
Arrays
Arrays are used to store multiple values in a single variable, instead of
declaring separate variables for each value.
To create an array, define the data type (like int) and specify the name of
the array followed by square brackets [].
36
To insert values to it, use a comma-separated list, inside curly braces:
Example
int myNumbers[] = {25, 50, 75, 100};
printf("%d", myNumbers[0]);
// Outputs 25
Example
myNumbers[0] = 33;
Example
int myNumbers[] = {25, 50, 75, 100};
myNumbers[0] = 33;
printf("%d", myNumbers[0]);
Example
int myNumbers[] = {25, 50, 75, 100};
int i;
37
for (i = 0; i < 4; i++) {
printf("%d\n", myNumbers[i]);
}
Example
// Declare an array of four integers:
int myNumbers[4];
// Add elements
myNumbers[0] = 25;
myNumbers[1] = 50;
myNumbers[2] = 75;
myNumbers[3] = 100;
Using this method, you should know the size of the array, in order for
the program to store enough memory.
You are not able to change the size of the array after creation.
C Multidimensional Arrays
Multidimensional Arrays
In the previous chapter, you learned about arrays, which is also known
as single dimension arrays. These are great, and something you will use a
lot while programming in C. However, if you want to store data as a tabular
form, like a table with rows and columns, you need to get familiar
with multidimensional arrays.
Arrays can have any number of dimensions. In this chapter, we will introduce
the most common; two-dimensional arrays (2D).
Two-Dimensional Arrays
38
A 2D array is also known as a matrix (a table of rows and columns).
The first dimension represents the number of rows [2], while the second
dimension represents the number of columns [3]. The values are placed in
row-order, and can be visualized like this:
This statement accesses the value of the element in the first row
(0) and third column (2) of the matrix array.
Example
int matrix[2][3] = { {1, 4, 2}, {3, 6, 8} };
Remember that: Array indexes start with 0: [0] is the first element. [1] is
the second element, etc.
The following example will change the value of the element in the first row
(0) and first column (0):
Example
39
int matrix[2][3] = { {1, 4, 2}, {3, 6, 8} };
matrix[0][0] = 9;
Example
int matrix[2][3] = { {1, 4, 2}, {3, 6, 8} };
int i, j;
for (i = 0; i < 2; i++) {
for (j = 0; j < 3; j++) {
printf("%d\n", matrix[i][j]);
}
}
C Strings
Strings
Strings are used for storing text/characters.
For example, "Hello World" is a string of characters.
To output the string, you can use the printf() function together with the
format specifier %s to tell C that we are now working with strings:
Example
char greetings[] = "Hello World!";
printf("%s", greetings);
40
Access Strings
Since strings are actually arrays in C, you can access a string by referring to
its index number inside square brackets [].
Example
char greetings[] = "Hello World!";
printf("%c", greetings[0]);
Note that we have to use the %c format specifier to print a single character.
Modify Strings
To change the value of a specific character in a string, refer to the index
number, and use single quotes:
Example
char greetings[] = "Hello World!";
greetings[0] = 'J';
printf("%s", greetings);
// Outputs Jello World! instead of Hello World!
You should also note that you can create a string with a set of characters.
This example will produce the same result as the example in the beginning of
this page:
Example
41
char greetings[] = {'H', 'e', 'l', 'l', 'o', '
', 'W', 'o', 'r', 'l', 'd', '!', '\0'};
printf("%s", greetings);
Differences
The difference between the two ways of creating strings, is that the first
method is easier to write, and you do not have to include the \0 character, as
C will do it for you.
You should note that the size of both arrays is the same: They both have 13
characters (space also counts as a character by the way), including the \
0 character:
Example
char greetings[] = {'H', 'e', 'l', 'l', 'o', '
', 'W', 'o', 'r', 'l', 'd', '!', '\0'};
char greetings2[] = "Hello World!";
C Special Characters
Strings - Special Characters
Because strings must be written within quotes, C will misunderstand this
string, and generate an error:
char txt[] = "We are the so-called "Vikings" from the north.";
The backslash (\) escape character turns special characters into string
characters:
42
\\ \ Backslash
Example
char txt[] = "We are the so-called \"Vikings\" from the north.";
Example
char txt[] = "It\'s alright.";
Example
char txt[] = "The character \\ is called backslash.";
\n New Line
\t Tab
\0 Null
C String Functions
String Functions
C also has many useful string functions, which can be used to perform
certain operations on strings.
To use them, you must include the <string.h> header file in your program:
#include <string.h>
String Length
For example, to get the length of a string, you can use the strlen() function:
43
Example
char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
printf("%d", strlen(alphabet));
In the Strings chapter, we used sizeof to get the size of a string/array. Note
that sizeof and strlen behaves differently, as sizeof also includes the \
0 character when counting:
Example
char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
printf("%d", strlen(alphabet)); // 26
printf("%d", sizeof(alphabet)); // 27
It is also important that you know that sizeof will always return the memory
size (in bytes), and not the actual string length:
Example
char alphabet[50] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
printf("%d", strlen(alphabet)); // 26
printf("%d", sizeof(alphabet)); // 50
Concatenate Strings
To concatenate (combine) two strings, you can use the strcat() function:
Example
char str1[20] = "Hello ";
char str2[] = "World!";
// Concatenate str2 to str1 (result is stored in str1)
strcat(str1, str2);
// Print str1
printf("%s", str1);
Note that the size of str1 should be large enough to store the result of the
two strings combined (20 in our example).
Copy Strings
To copy the value of one string to another, you can use the strcpy() function:
Example
char str1[20] = "Hello World!";
char str2[20];
// Copy str1 to str2
strcpy(str2, str1);
// Print str2
printf("%s", str2);
Note that the size of str2 should be large enough to store the copied string
(20 in our example).
44
Compare Strings
To compare two strings, you can use the strcmp() function.
It returns 0 if the two strings are equal, otherwise a value that is not 0:
Example
char str1[] = "Hello";
char str2[] = "Hello";
char str3[] = "Hi";
// Compare str1 and str2, and print the result
printf("%d\n", strcmp(str1, str2)); // Returns 0 (the strings are
equal)
// Compare str1 and str3, and print the result
printf("%d\n", strcmp(str1, str3)); // Returns -4 (the strings are not
equal)
C User Input
User Input
You have already learned that printf() is used to output values in C.
Example
Output a number entered by the user:
// Create an integer variable that will store the number we get from
the user
int myNum;
45
// Output the number the user typed
printf("Your number is: %d", myNum);
The scanf() function takes two arguments: the format specifier of the variable
(%d in the example above) and the reference operator ( &myNum), which stores
the memory address of the variable.
Tip: You will learn more about memory addresses and functions in the next
chapter.
Multiple Inputs
The scanf() function also allow multiple inputs (an integer and a character in
the following example):
Example
// Create an int and a char variable
int myNum;
char myChar;
// Get and save the number AND character the user types
scanf("%d %c", &myNum, &myChar);
Example
Output the name of a user:
// Create a string
char firstName[30];
46
printf("Enter your first name: \n");
Note that you must specify the size of the string/array (we used a very high
number, 30, but atleast then we are certain it will store enough characters
for the first name), and you don't have to specify the reference operator ( &)
when working with strings in scanf().
Example
char fullName[30];
From the example above, you would expect the program to print "John Doe",
but it only prints "John".
That's why, when working with strings, we often use the fgets() function
to read a line of text. Note that you must include the following arguments:
the name of the string variable, sizeof(string_name), and stdin:
Example
char fullName[30];
47
Use the scanf() function to get a single word as input, and use fgets() for
multiple words.
C Memory Address
Memory Address
When a variable is created in C, a memory address is assigned to the
variable.
The memory address is the location of where the variable is stored on the
computer.
To access it, use the reference operator (&), and the result represents where
the variable is stored:
Example
int myAge = 43;
printf("%p", &myAge); // Outputs 0x7ffe5367e044
Note: The memory address is in hexadecimal form (0x..). You will probably
not get the same result in your program, as this depends on where the
variable is stored on your computer.
You should also note that &myAge is often called a "pointer". A pointer basically
stores the memory address of a variable as its value. To print pointer values,
we use the %p format specifier.
You will learn much more about pointers in the next chapter.
Pointers are one of the things that make C stand out from other
programming languages, like Python and Java.
48
C Pointers
Creating Pointers
You learned from the previous chapter, that we can get the memory
address of a variable with the reference operator &:
Example
int myAge = 43; // an int variable
A pointer variable points to a data type (like int) of the same type, and is
created with the * operator.
The address of the variable you are working with is assigned to the pointer:
Example
int myAge = 43; // An int variable
int* ptr = &myAge; // A pointer variable, with the name ptr, that
stores the address of myAge
Example explained
Create a pointer variable with the name ptr, that points to an int variable
(myAge). Note that the type of the pointer has to match the type of the
variable you're working with (int in our example).
Use the & operator to store the memory address of the myAge variable, and
assign it to the pointer.
49
Now, ptr holds the value of myAge's memory address.
Dereference
In the example above, we used the pointer variable to get the memory
address of a variable (used together with the & reference operator).
You can also get the value of the variable the pointer points to, by using
the * operator (the dereference operator):
Example
int myAge = 43; // Variable declaration
int* ptr = &myAge; // Pointer declaration
Note that the * sign can be confusing here, as it does two different things in
our code:
Good To Know: There are two ways to declare pointer variables, but the
first way is recommended:
Pointers are one of the things that make C stand out from other
programming languages, like Python and Java.
They are important in C, because they allow us to manipulate the data in the
computer's memory. This can reduce the code and improve the performance.
50
If you are familiar with data structures like lists, trees and graphs, you
should know that pointers are especially useful for implementing those. And
sometimes you even have to use pointers, for example when working with
file handling or memory management.
C Functions
A function is a block of code which only runs when it is called.
Functions are used to perform certain actions, and they are important for
reusing code: Define the code once, and use it many times.
Predefined Functions
So it turns out you already know what a function is. You have been using it
the whole time while studying this tutorial!
Example
int main() {
printf("Hello World!");
return 0;
}
Create a Function
To create (often referred to as declare) your own function, specify the name
of the function, followed by parentheses () and curly brackets {}:
Syntax
void myFunction() {
// code to be executed
}
51
Example Explained
Call a Function
Declared functions are not executed immediately. They are "saved for later
use", and will be executed when they are called.
Example
Inside main, call myFunction():
// Create a function
void myFunction() {
printf("I just got executed!");
}
int main() {
myFunction(); // call the function
return 0;
}
Example
void myFunction() {
printf("I just got executed!");
}
52
int main() {
myFunction();
myFunction();
myFunction();
return 0;
}
C Function Parameters
Parameters and Arguments
Information can be passed to functions as a parameter. Parameters act as
variables inside the function.
Parameters are specified after the function name, inside the parentheses.
You can add as many parameters as you want, just separate them with a
comma:
Syntax
returnType functionName(parameter1, parameter2, parameter3) {
// code to be executed
}
Example
void myFunction(char name[]) {
printf("Hello %s\n", name);
}
int main() {
myFunction("Liam");
myFunction("Jenny");
myFunction("Anja");
return 0;
}
53
// Hello Liam
// Hello Jenny
// Hello Anja
Multiple Parameters
Inside the function, you can add as many parameters as you want:
Example
void myFunction(char name[], int age) {
printf("Hello %s. You are %d years old.\n", name, age);
}
int main() {
myFunction("Liam", 3);
myFunction("Jenny", 14);
myFunction("Anja", 30);
return 0;
}
// Hello Liam. You are 3 years old.
// Hello Jenny. You are 14 years old.
// Hello Anja. You are 30 years old.
Note that when you are working with multiple parameters, the function call
must have the same number of arguments as there are parameters, and the
arguments must be passed in the same order.
Example Explained
The function (myFunction) takes an array as its parameter (int myNumbers[5]),
and loops through the array elements with the for loop.
54
When the function is called inside main(), we pass along the myNumbers array,
which outputs the array elements.
Note that when you call the function, you only need to use the name of the
array when passing it as an argument myFunction(myNumbers). However, the full
declaration of the array is needed in the function parameter ( int
myNumbers[5]).
Return Values
The void keyword, used in the previous examples, indicates that the function
should not return a value. If you want the function to return a value, you can
use a data type (such as int or float, etc.) instead of void, and use
the return keyword inside the function:
Example
int myFunction(int x) {
return 5 + x;
}
int main() {
printf("Result is: %d", myFunction(3));
return 0;
}
// Outputs 8 (5 + 3)
Example
int myFunction(int x, int y) {
return x + y;
}
int main() {
printf("Result is: %d", myFunction(5, 3));
return 0;
}
// Outputs 8 (5 + 3)
55
return x + y;
}
int main() {
int result = myFunction(5, 3);
printf("Result is = %d", result);
return 0;
}
// Outputs 8 (5 + 3)
Example
// Create a function
void myFunction() {
printf("I just got executed!");
}
int main() {
myFunction(); // call the function
return 0;
}
A function consist of two parts:
You will often see C programs that have function declaration above main(),
and function definition below main(). This will make the code better
organized and easier to read:
Example
56
// Function declaration
void myFunction();
Another Example
If we use the example from the previous chapter regarding function
parameters and return values:
Example
int myFunction(int x, int y) {
return x + y;
}
int main() {
int result = myFunction(5, 3);
printf("Result is = %d", result);
return 0;
}
// Outputs 8 (5 + 3)
Example
// Function declaration
int myFunction(int, int);
57
C Recursion
Recursion
Recursion is the technique of making a function call itself. This technique
provides a way to break complicated problems down into simple problems
which are easier to solve.
Recursion may be a bit difficult to understand. The best way to figure out
how it works is to experiment with it.
Recursion Example
Adding two numbers together is easy to do, but adding a range of numbers is
more complicated. In the following example, recursion is used to add a range
of numbers together by breaking it down into the simple task of adding two
numbers:
Example
int sum(int k);
int main() {
int result = sum(10);
printf("%d", result);
return 0;
}
int sum(int k) {
if (k > 0) {
return k + sum(k - 1);
} else {
return 0;
}
}
Example Explained
When the sum() function is called, it adds parameter k to the sum of all
numbers smaller than k and returns the result. When k becomes 0, the
function just returns 0. When running, the program follows these steps:
Since the function does not call itself when k is 0, the program stops there
and returns the result.
58
The developer should be very careful with recursion as it can be quite easy to
slip into writing a function which never terminates, or one that uses excess
amounts of memory or processor power. However, when written correctly
recursion can be a very efficient and mathematically-elegant approach to
programming.
C Math Functions
Math Functions
There is also a list of math functions available, that allows you to perform
mathematical tasks on numbers.
To use them, you must include the math.h header file in your program:
#include <math.h>
Square Root
To find the square root of a number, use the sqrt() function:
Example
printf("%f", sqrt(16));
Round a Number
The ceil() function rounds a number upwards to its nearest integer, and
the floor() method rounds a number downwards to its nearest integer, and
returns the result:
Example
printf("%f", ceil(1.4));
printf("%f", floor(1.4));
Power
The pow() function returns the value of x to the power of y (xy):
Example
printf("%f", pow(4, 3));
59
Other Math Functions
A list of other popular math functions (from the <math.h> library) can be found
in the table below:
Function Description
C Structures (structs)
C Structures (structs)
Structures (also called structs) are a way to group several related variables
into one place. Each variable in the structure is known as a member of the
structure.
Unlike an array, a structure can contain many different data types (int, float,
char, etc.).
60
Create a Structure
You can create a structure by using the struct keyword and declare each of
its members inside curly braces:
Use the struct keyword inside the main() method, followed by the name of the
structure and then the name of the structure variable:
Create a struct variable with the name "s1":
struct myStructure {
int myNum;
char myLetter;
};
int main() {
struct myStructure s1;
return 0;
}
// Print values
printf("My number: %d\n", s1.myNum);
printf("My letter: %c\n", s1.myLetter);
61
return 0;
}
Now you can easily create multiple structure variables with different values,
using just one structure:
Example
// Create different struct variables
struct myStructure s1;
struct myStructure s2;
s2.myNum = 20;
s2.myLetter = 'C';
Example
struct myStructure {
int myNum;
char myLetter;
char myString[30]; // String
};
int main() {
struct myStructure s1;
return 0;
}
62
prog.c:12:15: error: assignment to expression with array type
However, there is a solution for this! You can use the strcpy() function and
assign the value to s1.myString, like this:
Example
struct myStructure {
int myNum;
char myLetter;
char myString[30]; // String
};
int main() {
struct myStructure s1;
return 0;
}
Result:
Simpler Syntax
You can also assign values to members of a structure variable at declaration
time, in a single line.
Just insert the values in a comma-separated list inside curly braces {}. Note
that you don't have to use the strcpy() function for string values with this
technique:
Example
// Create a structure
struct myStructure {
int myNum;
char myLetter;
char myString[30];
};
int main() {
// Create a structure variable and assign values to it
struct myStructure s1 = {13, 'B', "Some text"};
63
// Print values
printf("%d %c %s", s1.myNum, s1.myLetter, s1.myString);
return 0;
}
Note: The order of the inserted values must match the order of the variable
types declared in the structure (13 for int, 'B' for char, etc).
Copy Structures
You can also assign one structure to another.
Example
struct myStructure s1 = {13, 'B', "Some text"};
struct myStructure s2;
s2 = s1;
Modify Values
If you want to change/modify a value, you can use the dot syntax ( .).
And to modify a string value, the strcpy() function is useful again:
Example
struct myStructure {
int myNum;
char myLetter;
char myString[30];
};
int main() {
// Create a structure variable and assign values to it
struct myStructure s1 = {13, 'B', "Some text"};
// Modify values
s1.myNum = 30;
s1.myLetter = 'C';
strcpy(s1.myString, "Something else");
// Print values
printf("%d %c %s", s1.myNum, s1.myLetter, s1.myString);
return 0;
}
Modifying values are especially useful when you copy structure values:
64
Example
// Create a structure variable and assign values to it
struct myStructure s1 = {13, 'B', "Some text"};
// Create another structure variable
struct myStructure s2;
// Copy s1 values to s2
s2 = s1;
// Change s2 values
s2.myNum = 30;
s2.myLetter = 'C';
strcpy(s2.myString, "Something else");
// Print values
printf("%d %c %s\n", s1.myNum, s1.myLetter, s1.myString);
printf("%d %c %s\n", s2.myNum, s2.myLetter, s2.myString);
return 0;
}
65
C Enumeration (enum)
C Enums
An enum is a special type that represents a group of constants
(unchangeable values).
To create an enum, use the enum keyword, followed by the name of the enum,
and separate the enum items with a comma:
enum Level {
LOW,
MEDIUM,
HIGH
};
By default, the first item (LOW) has the value 0, the second (MEDIUM) has the
value 1, etc.
If you now try to print myVar, it will output 1, which represents MEDIUM:
int main() {
// Create an enum variable and assign a value to it
enum Level myVar = MEDIUM;
// Print the enum variable
printf("%d", myVar);
return 0;
}
66
Change Values
As you know, the first item of an enum has the value 0. The second has the
value 1, and so on.
To make more sense of the values, you can easily change them:
enum Level {
LOW = 25,
MEDIUM = 50,
HIGH = 75
};
printf("%d", myVar); // Now outputs 50
Note that if you assign a value to one specific item, the next items will
update their numbers accordingly:
enum Level {
LOW = 5,
MEDIUM, // Now 6
HIGH // Now 7
};
switch (myVar) {
case 1:
printf("Low Level");
break;
case 2:
printf("Medium level");
break;
case 3:
printf("High level");
break;
}
return 0;
}
67
Why And When To Use Enums?
Enums are used to give names to constants, which makes the code easier to
read and maintain.
Use enums when you have values that you know aren't going to change, like
month days, days, colors, deck of cards, etc.
68