Integers
0b11111111 | binary | 0B11111111 | binary | 0377 | octal | 255 | decimal |
0xff | hexadecimal | 0xFF | hexadecimal |
Real Numbers
88.0f / 88.1234567f |
single precision float ( f suffix ) |
88.0 / 88.123456789012345 |
double precision float ( no f suffix ) |
Signage
42 / +42 | positive | -42 | negative |
Binary notation 0b... / 0B... is available on GCC and most but not all C compilers. |
Characters
getchar() | Returns a single character's ANSI code from the input stream buffer as an integer. (safe) |
putchar(int) | Prints a single character from an ANSI code integer to the output stream buffer. |
Strings
gets(strName) | Reads a line from the input stream into a string variable. (Unsafe, removed in C11.) |
Alternative | |
fgets(strName, length, stdin); | Reads a line from the input stream into a string variable. (Safe) |
puts("string") | Prints a string to the output stream. |
Formatted Data
scanf("%d", &x) | Read value/s (type defined by format string) into variable/s (type must match) from the input stream. Stops reading at the first whitespace. & prefix not required for arrays (including strings.) (unsafe) |
printf("I love %c %d!", 'C', 99) | Prints data (formats defined by the format string) as a string to the output stream. |
Alternative
fgets(strName, length, stdin); sscanf(strName, "%d", &x); | Uses fgets to limit the input length, then uses sscanf to read the resulting string in place of scanf. (safe) |
Declaring
int x; | A variable. |
char x = 'C'; | A variable & initialising it. |
float x, y, z; | Multiple variables of the same type. |
const int x = 88; | A constant variable: can't assign to after declaration (compiler enforced.) |
Naming
johnny5IsAlive; | Alphanumeric, not a keyword, begins with a letter. |
Doesn't begin with a letter. | |
Do not use reserved keyword. |
Opening
FILE *fptr = fopen(filename, mode); | |
FILE *fptr | Declares fptr as a FILE type pointer (stores stream location instead of memory location.) |
fopen() | Returns a stream location pointer if successful, 0 otherwise. |
filename | String containing file's directory path & name. |
mode | String specifying the file access mode.. |
Modes
"r" / "rb" | Read existing text/binary file. |
"w" / "wb" | Write new/over existing text/binary file. |
"a" / "ab" | Write new/append to existing text/binary file. |
"r+" / "r+b" / "rb+" | Read and write existing text/binary file. |
"w+" / "w+b" / "wb+" | Read and write new/over existing text/binary file. |
"a+" / "a+b" / "ab+" | Read and write new/append to existing text/binary file. |
Closing
fclose(fptr); | Flushes buffers and closes stream. Returns 0 if successful, EOF otherwise. |
Random Access
ftell(fptr) | Return current file position as a long integer. |
fseek(fptr, offset, origin); | Sets current file position. Returns false is successful, true otherwise. The offset is a long integer type. |
SEEK_SET | Beginning of file. |
SEEK_CUR | Current position in file. |
SEEK_END | End of file. |
Utilities
feof(fptr) | Tests end-of-file indicator. |
rename(strOldName, strNewName) | Renames a file. |
remove(strName) | Deletes a file. |
Characters
fgetc(fptr) | Returns character read or EOF if unsuccessful. (safe) |
fputc(int c, fptr) | Returns character written or EOF if unsuccessful. |
Strings
fgets(char *s, int n, fptr) | Reads n-1 characters from file fptr into string s. Stops at EOF and \n. (safe) |
fputs(char *s, fptr) | Writes string s to file fptr. Returns non-negative on success, EOF otherwise. |
Formatted Data
fscanf(fptr, format, [...]) | Same as scanf with additional file pointer parameter. (unsafe) |
fprintf(fptr, format, [...]) | Same as printf with additional file pointer parameter. |
fgets(strName, length, fptr); sscanf(strName, "%d", &x); | Uses fgets to limit the input length, then uses sscanf to read the resulting string in place of scanf. (safe) |
Binary
fread(void *ptr, sizeof(element), number, fptr) | Reads a number of elements from fptr to array *ptr. (safe) |
fwrite(void *ptr, sizeof(element), number, fptr) | Writes a number of elements to file fptr from array *ptr. |
Safe functions are those that let you specify the length of the input. Unsafe functions do not, and carry the risk of memory overfl |
printf("%d%d...", arg1, arg2...); | ||
Type | Example | Description |
%d or %i | -42 | Signed decimal integer. |
%u | 42 | Unsigned decimal integer. |
%o | 52 | Unsigned octal integer. |
%x or %X | 2a or 2A | Unsigned hexadecimal integer. |
%f or %F | 1.21 | Signed decimal float. |
%e or %E | 1.21e+9 or 1.21E+9 | Signed decimal w/ scientific notation. |
%g or %G | 1.21e+9 or 1.21E+9 | Shortest representation of %f/%F or %e/%E. |
%a or %A | 0x1.207c8ap+30 or 0X1.207C8AP+30 | Signed hexadecimal float. |
%c | a | A character. |
%s | A String. | A character string. |
%p | A pointer. | |
%% | % | A percent character. |
%n | No output, saves # of characters printed so far. Respective printf argument must be an integer pointer. |
Defining
struct strctName{ type x; type y; }; | A structure type strctName with two members, x and y. Note trailing semicolon |
struct item{ struct item *next; }; | A structure with a recursive structure pointer inside. Useful for linked lists. |
Declaring
struct strctName varName; | A variable varName as structure type strctName. |
struct strctName *ptrName; | A strctName structure type pointer, ptrName. |
struct strctName{ type a; type b; } varName; | Shorthand for defining strctName and declaring varName as that structure type. |
struct strctName varName = { a, b }; | A variable varName as structure type strctName and initialising its members. |
Accessing
varName.x | Member x of structure varName. |
ptrName->x | Value of structure pointer ptrName member x. |
Bit Fields
struct{char a:4, b:4} x; | Declares x with two members a and b, both four bits in size (0 to 15.) |
Array members can't be assigned bit fields. |
%[Flags][Width][.Precision][Length]Type
Flags
- | Left justify instead of default right justify. |
+ | Sign for both positive numbers and negative. |
# | Precede with 0, 0x or 0X for %o, %x and %X tokens. |
space | Left pad with spaces. |
0 | Left pad with zeroes. |
Width
integer | Minimum number of characters to print: invokes padding if necessary. Will not truncate. |
* | Width specified by a preceding argument in printf. |
Precision
.integer | Minimum # of digits to print for %d, %i, %o, %u, %x, %X. Left pads with zeroes. Will not truncate. Skips values of 0. |
Minimum # of digits to print after decimal point for %a, %A, %e, %E, %f, %F (default of 6.) | |
Minimum # of significant digits to print for %g & %G. | |
Maximum # of characters to print from %s (a string.) | |
. | If no integer is given, default of 0. |
.* | Precision specified by a preceding argument in printf. |
Length
hh | Display a char as int. |
h | Display a short as int. |
l | Display a long integer. |
ll | Display a long long integer. |
L | Display a long double float. |
z | Display a size_t integer. |
j | Display a intmax_t integer. |
t | Display a ptrdiff_t integer. |
Defining
typedef unsigned short uint16; | Abbreviating a longer type name to uint16. |
ypedef struct structName{int a, b;}newType; | Creating a newType from a structure. |
typedef enum typeName{false, true}bool; | Creating an enumerated bool type. |
Declaring
uint16 x = 65535; | Variable x as type uint16. |
newType y = {0, 0}; | Structure y as type newType. |
Defining
union uName{int x; char y[8];} | A union type uName with two members, x & y. Size is same as biggest member size. |
Declaring
union uN vName; | A variable vName as union type uN. |
Accessing
vName.y[int] | Members cannot store values concurrently. Setting y will corrupt x. |
Defining
enum bool { false, true }; | A custom data type bool with two possible states: false or true. |
Declaring
enum bool varName; | A variable varName of data type bool. |
Accessing
varName = true; | Variable varName can only be assigned values of either false or true. |
Evaluating
if(varName == false) | Testing the value of varName. |
Defining
type *x; | Pointers have a data type like normal variables. |
void *v; | They can also have an incomplete type. Operators other than assignment cannot be applied as the length of the type is unknown. |
struct type *y; | A data structure pointer. |
type z[]; | An array/string name can be used as a pointer to the first array element. |
Accessing
x | A memory address. |
*x | Value stored at that address. |
y->a | Value stored in structure pointer y member a. |
&varName | Memory address of normal variable varName. |
*(type *)v | Dereferencing a void pointer as a type pointer. |
A pointer is a variable that holds a memory location. |
Declaring
type name[int]; | You set array length. |
type name[int] = {x, y, z}; | You set array length and initialise elements. |
type name[int] = {x}; | You set array length and initialise all elements to x. |
type name[] = {x, y, z}; | Compiler sets array length based on initial elements. |
Size cannot be changed after declaration. |
Dimensions
name[int] | One dimension array. |
name[int][int] | Two dimensional array. |
Accessing
name[int] | Value of element int in array name. |
*(name + int) | Same as name[int]. |
Elements are contiguously numbered ascending from 0. | |
&name[int] | Memory address of element int in array name. |
name + int | Same as &name[int]. |
Elements are stored in contiguous memory. |
Measuring
sizeof(array) / sizeof(arrayType) | Returns length of array. (Unsafe) |
sizeof(array) / sizeof(array[0]) | Returns length of array. (Safe) |
#include <inbuilt.h> | Replaces line with contents of a standard C header file. |
#include "./custom.h" | Replaces line with contents of a custom header file. Note dir path prefix & quotations. |
#define NAME value | Replaces all occurrences of NAME with value. |
// We're single-line comments!
// Nothing compiled after // on these lines.
/* I'm a multi-line comment!
Nothing compiled between
these delimiters. */
_Alignas | break | float | signed |
_Alignof | case | for | sizeof |
_Atomic | char | goto | static |
_Bool | const | if | struct |
_Complex | continue | inline | switch |
_Generic | default | int | typedef |
_Imaginary | do | long | union |
_Noreturn | double | register | unsigned |
_Static_assert | else | restrict | void |
_Thread_local | enum | return | volatile |
auto | extern | short | while |
E[0-9]... | E[A-Z]... | is[a-z]... | to[a-z]... |
LC_[A-Z]... | SIG[A-Z]... | SIG_[A-Z]... | str[a-z]... |
mem[a-z]... | wcs[a-z]... | ..._t |
Name | Reserved By Library |
---|---|
d_... | dirent.h |
l_... | fcntl.h |
F_... | fcntl.h |
O_... | fcntl.h |
S_... | fcntl.h |
gr_... | grp.h |
..._MAX | limits.h |
pw_... | pwd.h |
sa_... | signal.h |
SA_... | signal.h |
st_... | sys/stat.h |
S_... | sys/stat.h |
tms_... | sys/times.h |
c_... | termios.h |
V... | termios.h |
I... | termios.h |
O... | termios.h |
TC... | termios.h |
B[0-9]... | termios.h |
'A' character | Single quotes. |
"AB" string | Double quotes. |
\0 | Null terminator. |
Strings are char arrays. | |
char name[4] = "Ash"; | |
is equivalent to | |
char name[4] = {'A', 's', 'h', '\0'}; | |
int i; for(i = 0; name[i]; i++){} | |
\0 evaluates as false. | |
Strings must include a char element for \0. |
\a | alarm (bell/beep) | \b | backspace |
\f | formfeed | \n | newline |
\r | carriage return | \t | horizontal tab |
\v | vertical tab | \\ | backslash |
\' | single quote | \" | double quote |
\? | question mark | ||
\nnn | Any octal ANSI character code. | ||
\xhh | Any hexadecimal ANSI character code. |
#include <stdlib.h>
Allocating
malloc(); | Returns a memory location if successful, NULL otherwise. |
type *x; x = malloc(sizeof(type)); | Memory for a variable. |
type *y; y = malloc(sizeof(type) * length ); | Memory for an array/string. |
struct type *z; z = malloc(sizeof(struct type)); | Memory for a structure. |
Deallocating
free(ptrName); | Removes the memory allocated to ptrName. |
Reallocating
realloc(ptrName, size); | Attempts to resize the memory block assigned to ptrName. |
Declaring
type/void funcName([args...]){ [return var;] } | |
Function names follow the same restrictions as variable names but must also be unique. | |
type/void | Return value type (void if none.) |
funcName() | Function name and argument parenthesis. |
args... | Argument types & names (void if none.) |
{} | unction content delimiters. |
return var; | Value to return to function call origin. Skip for void type functions. Functions exit immediately after a return. |
By Value vs By Pointer
void f(type x); f(y); | Passing variable y to function f argument x (by value.) |
void f(type *x); f(array); | Passing an array/string to function f argument x (by pointer.) |
void f(type *x); f(structure); | Passing a structure to function f argument x (by pointer.) |
void f(type *x); f(&y); | Passing variable y to function f argument x (by pointer.) |
type f(){ return x; } | Returning by value. |
type f(){ type x; return &x; } | Returning a variable by pointer. |
type f(){ static type x[]; return &x; } | Returning an array/string/structure by pointer. The static qualifier is necessary otherwise x won't exist after the function exits. |
Scope
int f(){ int i = 0; } | |
i is declared inside f(), it doesn't exist outside that function. |
Prototyping
type funcName(args...); | |
Place before declaring or referencing respective function (usually before main.) | |
type funcName([args...]) | Same type, name and args... as respective function. |
; | Semicolon instead of function delimiters. |
#include <stdlib.h>
Randomicity
rand() | Returns a (predictable) random integer between 0 and RAND_MAX based on the randomiser seed. |
RAND_MAX | The maximum value rand() can generate. |
srand(unsigned integer); | Seeds the randomiser with a positive integer. |
(unsigned) time(NULL) | Returns the computer's tick-tock value. Updates every second. |
Sorting
qsort(array, length, sizeof(type), compFunc); | |
qsort() | Sort using the QuickSort algorithm. |
array | Array/string name. |
length | Length of the array/string. |
sizeof(type) | Byte size of each element. |
compFunc | Comparison function name. |
compFunc
int compFunc( const void *a, const void b* ){ return( *(int *)a - *(int *)b); } | |
int compFunc() | Function name unimportant but must return an integer. |
const void *a, const void *b | Argument names unimportant but must identical otherwise. |
return( *(int *)a - *(int *)b); | Negative result swaps b for a, positive result swaps a for b, a result of 0 doesn't swap. |
int main(int argc, char *argv[]){return int;}
Anatomy
int main | Program entry point. |
int argc | # of command line arguments. |
char *argv[] | Command line arguments in an array of strings. #1 is always the program filename. |
return int; | Exit status (integer) returned to the OS upon program exit. |
Command Line Arguments
app two 3 | Three arguments, "app", "two" and "3". |
app "two 3" | Two arguments, "app" and "two 3". |
main is the first function called when the program executes. |
tolower(char) | Lowercase char. |
toupper(char) | Uppercase char. |
isalpha(char) | True if char is a letter of the alphabet, false otherwise. |
islower(char) | True if char is a lowercase letter of the alphabet, false otherwise. |
isupper(char) | True if char is an uppercase letter of the alphabet, false otherwise. |
isnumber(char) | True if char is numerical (0 to 9) and false otherwise. |
isblank | True if char is a whitespace character (' ', '\t', '\n') and false otherwise. |
if, else if, else
if(a) b; | Evaluates b if a is true. |
if(a){ b; c; } | Evaluates b and c if a is true. |
if(a){ b; }else{ c; } | Evaluates b if a is true, c otherwise. |
if(a){ b; }else if(c){ d; }else{ e; } | Evaluates b if a is true, otherwise d if c is true, otherwise e. |
switch, case, break
switch(a){ case b: c; } | Evaluates c if a equals b. |
switch(a){ default: b; } | Evaluates b if a matches no other case. |
switch(a){ case b: case c: d; } | Evaluates d if a equals either b or c. |
switch(a){ case b: c; case d: e; default: f; } | Evaluates c, e and f if a equals b, e and f if a equals d, otherwise f. |
switch(a){ case b: c; break; case d: e; break; default: f; } | Evaluates c if a equals b, e if a equals d and e otherwise. |
#include <string.h>
strlen(a) | Returns # of char in string a as an integer. Excludes \0. (unsafe) |
strcpy(a, b) | Copies strings. Copies string b over string a up to and including \0. (unsafe) |
strcat(a, b) | Concatenates strings. Copies string b over string a up to and including \0, starting at the position of \0 in string a. (unsafe) |
strcmp(a, b) | Compares strings. Returns false if string a equals string b, true otherwise. Ignores characters after \0. (unsafe) |
strstr(a, b) | Searches for string b inside string a. Returns a pointer if successful, NULL otherwise. (unsafe) |
Alternatives
strncpy(a, b, n) | Copies strings. Copies n characters from string b over string a up to and including \0. (safe) |
strncat(a, b, n) | Concatenates strings. Copies n characters from string b over string a up to and including \0, starting at the position of \0 in string a. (safe) |
strncmp(a, b, n) | Compares first n characters of two strings. Returns false if string a equals string b, true otherwise. Ignores characters after \0. (safe) |
Safe functions are those that let you specify the length of the input. Unsafe functions do not, and carry the risk of memory overflow. |
while
int x = 0; while(x < 10){ x += 2; } | Loop skipped if test condition initially false. |
int x = 0; | Declare and initialise integer x. |
while() | Loop keyword and condition parenthesis. |
x < 10 | Test condition. |
{} | Loop delimiters. |
x += 2; | Loop contents. |
do while
char c = 'A'; do { c++; } while(c != 'Z'); | |
Always runs through loop at least once. | |
char c = 'A'; | Declare and initialise character c. |
do | Loop keyword. |
{} | Loop delimiters. |
c++; | Loop contents. |
while(); | Loop keyword and condition parenthesis. Note semicolon. |
c != 'Z' | Test condition. |
for
int i; for(i = 0; n[i] != '\0'; i++){} (C89) | |
OR | |
for(int i = 0; n[i] != '\0'; i++){} (C99+) | |
Compact increment/decrement based loop. | |
int i; | Declares integer i. |
for() | Loop keyword. |
i = 0; | Initialises integer i. Semicolon. |
n[i] != '\0'; | Test condition. Semicolon. |
i++ | Increments i. No semicolon. |
{} | Loop delimiters. |
continue
int i=0; while(i<10){ i++; continue; i--;} |
Skips rest of loop contents and restarts at the beginning of the loop. |
break
int i=0; while(1){ if(x==10){break;} i++; } |
Skips rest of loop contents and exits loop. |
#include <time.h>
Variable Types
time_t | Stores the calendar time. |
struct tm *x; | Stores a time & date breakdown. |
tm structure members:
int tm_sec | Seconds, 0 to 59. |
int tm_min | Minutes, 0 to 59. |
int tm_hour | Hours, 0 to 23. |
int tm_mday | Day of the month, 1 to 31. |
int tm_mon | Month, 0 to 11. |
int tm_year | Years since 1900. |
int tm_wday | Day of the week, 0 to 6. |
int tm_yday | Day of the year, 0 to 365. |
int tm_isdst | Daylight saving time. |
Functions
time(NULL) | Returns unix epoch time (seconds since 1/Jan/1970.) |
time(&time_t); | Stores the current time in a time_t variable. |
ctime(&time_t) | Returns a time_t variable as a string. |
x = localtime( &time_t); | Breaks time_t down into struct tm members. |
by descending evaluation precedence
+a | Sum of 0 (zero) and a. (0 + a) |
-a | Difference of 0 (zero) and a. (0 - a) |
!a | Complement (logical NOT) of a. (~a) |
~a | Binary ones complement (bitwise NOT) of a. (~a) |
++a | Increment of a by 1. (a = a + 1) |
--a | Decrement of a by 1. (a = a - 1) |
a++ | Returns a then increments a by 1. (a = a + 1) |
a-- | Returns a then decrements a by 1. (a = a - 1) |
(type)a | Typecasts a as type. |
&a; | Memory location of a. |
sizeof(a) | Memory size of a (or type) in bytes. |
by descending evaluation precedence
a * b; | Product of a and b. (a × b) |
a / b; | Quotient of dividend a and divisor b. Ensure divisor is non-zero. (a ÷ b) |
a % b; | Remainder of integers dividend a and divisor b. |
a + b; | Sum of a and b. |
a - b; | Difference of a and b. |
a << b; | Left bitwise shift of a by b places. (a × 2 b) |
a >> b; | Right bitwise shift of a by b places. (a × 2-b) |
a < b; | Less than. True if a is less than b and false otherwise. |
a <= b; | Less than or equal to. True if a is less than or equal to b and false otherwise. (a ≤ b) |
a > b; | Greater than. True if a is greater than than b and false otherwise. |
a >= b; | Greater than or equal to. True if a is greater than or equal to b and false otherwise. (a ≥ b) |
a == b; | Equality. True if a is equal to b and false otherwise. (a ⇔ b) |
a != b; | Inequality. True if a is not equal to b and false otherwise. (a ≠ b) |
a & b; | Bitwise AND of a and b. (a ⋂ b) |
a ^ b; | Bitwise exclusive-OR of a and b. (a ⊕ b) |
a | b; | Bitwise inclusive-OR of a and b. (a ⋃ b) |
a && b; | Logical AND. True if both a and b are non-zero. (Logical AND) (a ⋂ b) |
a || b; | Logical OR. True if either a or b are non-zero. (Logical OR) (a ⋃ b) |
by descending evaluation precedence
x ? a : b; | Evaluates a if x evaluates as true or b otherwise. (if(x){ a; } else { b; }) |
x = a; | Assigns value of a to x. |
a *= b; | Assigns product of a and b to a. (a = a × b) |
a /= b; | Assigns quotient of dividend a and divisor b to a. (a = a ÷ b) |
a %= b; | Assigns remainder of integers dividend a and divisor b to a. (a = a mod b) |
a += b; | Assigns sum of a and b to a. (a = a + b) |
a -= b; | Assigns difference of a and b to a. (a = a - b) |
a <<= b; | Assigns left bitwise shift of a by b places to a. (a = a × 2b) |
a >>= b; | Assigns right bitwise shift of a by b places to a. (a = a × 2-b) |
a &= b; | Assigns bitwise AND of a and b to a. (a = a ⋂ b) |
a ^= b; | Assigns bitwise exclusive-OR of a and b to a. (a = a ⊕ b) |
a |= b; | Assigns bitwise inclusive-OR of a and b to a. (a = a ⋃ b) |