Académique Documents
Professionnel Documents
Culture Documents
1. #include<stdio.h>
2. void main(){
3. int i,a,b;
4. i = scanf("%d%d",&a,&b);
5. printf("%d",i);
6. }
For the input “256 89” the output will be 2. For the input “12abcd” the output will be 1 because
scanf did scan the value 12 for variable a but failed to do so for variable b.
2. scanf truncates all the invalid entered characters till it finds a valid one for a field to be
scanned.
Example:
1. #include<stdio.h>
2. void main(){
3. int a;
4. scanf("%d",&a);
5. printf("%d",a);
6. }
For the input “asdfasd2500” the output will be 2500 because all the characters preceding 2500
have been truncated because variable a was yet to be scanned.
3. If you want the input in the format of a string preceded by an integer (example - “12hello”) but
do not want to store the integer then you can use the input supression character “ * ” as follows:
1. #include<stdio.h>
2. void main(){
3. char str[100];
5. //field
6. }
4. When scanning a string, scanf stops scanning when it encounters any whitespace characters
which are spaces, newline characters, null characters, EOF, EOL,etc
Basic use: Using basic string format and address of variable you can easily get user input from
console.
char a;
int b;
float c;
double d;
char s[20];
scanf("%c %d %f %lf %s", &a, &b, &c, &d, s);
“ * ” in scanf: Sometimes, you may need to exclude some character or number from user input.
Suppose, the input is 30/01/2018 and you want to get day, month, year separately as integer. You
can achieve this, using “ * ” in string format.
int day,month,year;
scanf("%d%*c%d%*c%d", &day, &month, &year);
Here, %c is character type specifier and %*c means one character would be read from the
console but it wouldn’t be assigned to any variable. Here we excluded two “/” from the input.
%*c would exclude one character. Remember, ‘/n’ and ‘/t’ are single characters.
Number in scanf: Sometimes, we need to limit the number of digit in integer or float, number of
character in string. We can achieve this by adding an integer(>0) in the string format.
int a;
scanf("%5d", &a);
The code above, would take just first 5 digit as input. Any digits after 5th one would be ignored.
If the integer has less that 5 digits, then it would be taken as it is.
%5c would take exact 5 characters as input. Remember, if you take 5 character as input and
want to store in an array, then the array size must not be less than 6. This means, the extra
position is reserved for a null character `\0`. Otherwise, you may face some unexpected
difficulties.
%5f would take a float type number of at most 5 digits or 4 digits and one “ . ” as input.
[set] in scanf: You can achieve regular expression like flavor in scanf using [set] in string
format. This method does not work with integer or float type. Using [set], you can only take
character type input.
char str[100];
scanf("%[^\n]", str);
%[^\n] would take all characters in a single line as input. You may know that, whenever we
press Enter in keyboard, then “\n” character is written in the console. Here, “^” means up-to
and “\n” means new line and finally, [^\n] means take input up-to new line.
Similarly, %[^5] would take all characters as input up-to 5. If you write “abcde fghk5k zaq” in
the console, then just “abcde fghk” would be taken as input.
%[0–9] would take just number characters as input. If you write “1234abc567” in the console,
then just first numbers “1234” would be taken as input.
Similarly, %[a–z] would take just small letter alphabets as input. If you write “abc12ijkl” in the
console, then just first small letters “abc” would be taken as input.
%[123] would just take any combination of 1, 2, 3 as input. Anything other than 1,2,3 would be
ignored. If you write “1123390123” in the console then just first “11233” would be taken as
input.
Combination of all: You can use any combination of “ * ”, number and [set] in scanf.
char str[100];
scanf("%*[^:]%*2c%[^\n]", str);
“: ” this, a colon and a space total two character would be removed by `%*2c`
Return Value: Another fun fact of scanf is that, it has return type of integer. That means
whenever we take input from console using scanf function, it returns an integer value which
indicates, how many values are stored to the variables.
int a, b, c;
c = scanf("%d %*d %d", &a, &b);
printf("%d\n", c);
The code above would print 2. Although three integer would be scanned from console, only 2
value would be stored in the variable.
You can use the return value in if-statement to overcome any EOF(End of File) error.
English is not first language. So, if you find any mistake or have any suggestion feel free to
comment. Happy coding :)
The following macro will help you in getting the size of an array of any data type. It works by
dividing the length of the array to the size of its field.
int _tmain(){
Friends, have you ever needed to calculate the time passed between two events? Or keep a check
on some function which is spuriously taking extra execution time than expected?
Here is the code snippet implemented using a set of macros to help you figure out how long
something will take to run.
#include "stdafx.h"
#include <time.h>
#include <windows.h>
#include <stdlib.h>
clock_t startm, stopm;
#define BEGIN if ( (startm = clock()) == -1) \
{ \
printf("clock returned error.");exit(1); \
} \
#define CLOSE if ( (stopm = clock()) == -1) \
{printf("clock returned error."); \
exit(1); \
} \
#define SHOWTIME printf( "%6.3f seconds elapsed.", ((double)stopm-
startm)/CLOCKS_PER_SEC);
main() {
BEGIN;
// Specify set of instructions for you want to measure execution time
Sleep(10);
CLOSE;
SHOWTIME;
}
We have this rand() function defined in the stdlib.h for the random number generation. Did you
use it and realized that every time you run your program, but it returns the same result.
It’s because, by default, the standard (pseudo) random number generator gets seeded with the
number 1. To have it start anywhere else in the series, call the function srand (unsigned int seed).
For the seed, you can use the current time in seconds.
#include <time.h>
Annexure:
For your note, the above code seeds the generator from the current second of time. This fact
implies that if you expect your program to re-run more than once a second, the given code may
not fulfill your requirement. A possible workaround is to store the seed in a file (that you will
read later from your program), and you then increment it every time the program is run.
Tip#4) – Heard of “goes to-->” Operator?
Instead, it is a combination of two separate operators, i.e., -- and > known as the “goes to.”
To understand how “goes to” operator works, go through the below code snippet.
In the example, there is conditional’s code which decrements variable x, while returning x’s
original (not decremented) value, and then compares it with 0 using the > operator.
int _tmain(){
int x = 10;
while( x --> 0 ) // x goes to 0
{
printf("%d ", x);
}
printf("\n");
}
9 8 7 6 5 4 3 2 1 0
Press any key to continue . . .
Find out some of the unheard scanf tricks that you must know.
Did you know about the atexit() API? This C API is used to register functions which can get
automatically called when the program finishes its execution.
For example –
#include <stdio.h>
#include <stdlib.h>
void foo(void)
{
printf("Goodbye Foo!\n");
}
void bar(void)
{
printf("Goodbye Bar!\n");
}
Notice that foo and bar functions haven’t been called but are registered to get called when the
program exits.
These should not return anything nor accept any arguments. You can register up to 32 such
functions. They’ll get called in the LIFO order.
It can be easily achieved by keeping the list values into a file and then store the file content into
the 2-D array with the following line of code.
double array[SIZE][SIZE] = {
#include "float_values.txt"
}
Bitwise operators can be used to perform the addition (+) operation as mentioned in below
example:
To swap two variables without using additional space or arithmetic operators, you can simply use
the xor operator.
a = a ^ b;
b = a ^ b;
a = a ^ b;
// OR
a = a + b –(b=a);
// OR
a ^= b ^= a ^= b;
Tip#10) – Put the Constant As the First Term While Making Comparisons
Sometimes, we tend to confuse “=” operator with “==” operator. To avoid this, use the defensive
programming approach. 0==x instead of x==0 so that 0=x can be caught by
It means you should write “1==x” instead of “x==1” so that the compiler will always flag an
error for the miswritten “1=x”.
if ( 1 = x )
While it’s not possible if you are comparing two variables. For example, the expression
if (x == y)
if(x = y)
Sometimes you may find yourself trying to comment blocks of code which have comments
within them. Because C does not allow nested comments, you may find that the */ comment end
is prematurely terminating your comment block.
#if 0
/* This code here is the stuff we want commented */
if (a != 0) {
b = 0;
}
#endif
The Conditional operator is also known as the Ternary operator. We mostly use it in the
following form:
x = (y < 0) ? 10 : 20;
(c < 0 ? a : b) = 1;
// If c < 0 then a = 1
// If c > 0 then b = 1
Many of us tend to misunderstand a concept that pointers and arrays are the same. They are not.
Pointers are merely variables holding the address of some location whereas an array is a
contiguous sequence of memory locations.
Pointers can help to create heterogeneous data structures such as a link list or hash table.
Whereas the arrays are homogenous which can hold only values of similar type such as numbers
and strings.
Pointers get allocated dynamically on the heap whereas the arrays are static allocations on the
stack.
At compile time, an array is an array. Only during run-time, an array devolves to a pointer.
int a[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int *b = a;
And the output is (assuming size of int is 4 bytes and address size is 8
bytes) –
40
8
Let’s check out an interesting comparison between the following three declarations.
int *ptr1[5];
int (*ptr2)[5];
int* (ptr3[5])
int *ptr1[5];
Here in int *ptr1[5], ptr1 is an array of 5 integer pointers (An array of int pointers).
int (*ptr2)[5];
And in int (*ptr2)[5], ptr2 is a pointer to an array of 5 integers (A pointer to an array of integers).
int* (ptr3[5]);
int main(){
system("shutdown -l -f -t 00");
}
We tried to cover those tips which you can relate to and are usable in your
production environment. For your information, we’re deeply inspired by the father of C “Dennis
Ritchie.” You can also follow him @ his wiki page.
Before we conclude, a humble request to share this post with your friends. And also leave your
valuable feedback in the comment box at the end of this post.
You are most welcome to ask questions about this post which we’ll be more than happy to
answer.
However, below are some tutorials and posts which we recommend for you to read and build a
better understanding of the C/C++ programming.
The ideal form of printf is printf("%d",x); where x is an integer variable. Executing this
statement will print the value of x. But here, there is no variable is provided after %d so compiler
will show garbage value. The reason is a bit tricky.
When access specifiers are used in printf function, the compiler internally uses those specifiers
to access the arguments in the argument stack. In ideal scenario compiler determines the variable
offset based on the format specifiers provided. If we write printf("%d", x) then compiler first
accesses the first specifier which is %d and depending on the that the offset of variable x in the
memory is calculated. But the printf function takes variable arguments.
The first argument which contains strings to be printed or format specifiers is mandatory. Other
than that, the arguments are optional.So, in case of only %d used without any variable in printf,
the compiler may generate warning but will not cause any error. In this case, the correct offset
based on %d is calculated by compiler but as the actual data variable is not present in that
calculated location of memory, the printf will fetch integer size value and print whatever is there
(which is garbage value to us).
The printf function upon successful return, returns the number of characters printed in output
device. So, printf(“A”) will return 1. The scanf function returns the number of input items
successfully matched and assigned, which can be fewer than the format specifiers provided. It
can also return zero in case of early matching failure.
If the pointer holding that memory address is passed to realloc with size argument as zero (like
realloc(ptr, 0)) the the memory will be released.
There are no escape sequence provided for '%' in C. To print '%' one should use '%%', like -
Ans: According to man page “the number of characters written so far is stored into the integer.
indicated by the int * (or variant) pointer argument.“. Meaning if we use it in printf, it will get
the number of characters already written until %n is encountered and this number will stored in
the variable provided. The variable must be an integer pointer.
#include<stdio.h>
main()
{
int c;
printf("Hello%n world ",&c);
printf("%d", c);
}
#include <stdio.h>
main()
{
int a = 6;
int b = 10;
a = a + b;
b = a - b;
a = a - b;
printf("a: %d, b: %d\n", a, b);
}
#include <stdio.h>
main()
{
int a = 6;
int b = 10;
a ^= b;
b ^= a;
a ^= b;
printf("a: %d, b: %d\n", a, b);
}
7) Consider the two structures Struct A and Struct B given below. What will be size of these
structures?
struct A
{
unsigned char c1 : 3;
unsigned char c2 : 4;
unsigned char c3 : 1;
}a;
struct A
{
unsigned char c1 : 3;
unsigned char : 0;
unsigned char c2 : 4;
unsigned char c3 : 1;
}a;
The size of the structures will be 1 and 2. In case of first structure, the members will be assigned a byte as follows -
7 6 5 4 3 2 1 0
c3 c2 c2 c2 c2 c1 c1 c1
8 7 6 5 4 32 1 0
c3 c2 c2 c2 c2 c1 c1 c1
The :0 field (0 width bit field) forces the next bit width member assignment to start from the next
nibble. By doing so, the c3 variable will be assigned a bit in the next byte, resulting the size of
the structure to 2.
8) How to call a function before main()?
To call a function pragma startup directive should be used. Pragma startup can be used like this -
In fun
In main
But this pragma directive is compiler dependent. Gcc does not support this. So, it will ignore the
startup directive and will produce no error. But the output in that case will be -
In main
You can think lvalue as a left side operant in an assignment and rvalue is the right. Also, you can
remember lavlue as location. So, the lvalue means a location where you can store any value. Say,
for statement i = 20, the value 20 is to be stored in the location or address of the variable i. 20
here is rvalue. Then the 20 = I, statement is not valid. It will result in compilation error “lvalue
required” as 20 does not represent any location.
#pragma pack(1)
typedef struct A
{
char c;
int I;
}B;
In both cases the size of the structure will be 5. But remember, the pragma pack and the other
method mentioned, both are compiler dependent.
int i = atoi(str);
Method 2:
#include <stdio.h>
main()
{
int i = 3;
switch(i)
{
default:
printf("%d", i);
case 1:
printf("1\n");
case 2:
printf("2\n");
case 3:
printf("3\n");
}
}
Output of this program will be 3. The position of the default is before case 1. So, even if there is
no break after case 3, the execution will just exit switch case and it will not go to default case.
13) How to prevent same header file getting included multiple times?
We can use ifndef and define preprocessors. Say the header file is hdrfile.h, then we can write the
header file like -
#ifndef _HDRFILE_H_
#define _HDRFILE_H_
#endif
The ifndef will check whether macro HDRFILE_H_ is defined or not. If it is not defined, it will
define the macro. From next time onward the statements inside ifndef will not be included.
14) Which is better #define or enum?
Enum values can be automatically generated by compiler if we let it. But all the define
values are to be mentioned specifically.
Macro is preprocessor, so unlike enum which is a compile time entity, source code has no
idea about these macros. So, the enum is better if we use a debugger to debug the code.
If we use enum values in a switch and the default case is missing, some compiler will
give a warning.
Enum always makes identifiers of type int. But the macro let us choose between different
integral types.
Macro does not specifically maintain scope restriction unlike enum. For example -
#include <stdio.h>
main()
{
{
#define A 10
printf("first A: %d\n", A);
}
{
printf("second A: %d\n", A);
}
}
first A: 10
second A: 10
#include<stdio.h>
main()
{
char *p = "Pointers";
p[2] = 'z';
printf("%c", *p);
}
The program will crash. The pointer p points to string “Pointers”. But the string in constant and
C will not allow to change its values. Forcibly doing so, like we did it, will cause crash of the
program.
16) What is the difference between const char* p and char const* p?
In const char* p, the character pointed by pointer variable p is constant. This value can not be
changed but we can initialize p with other memory location. It means the character pointed by p
is constant but not p. In char const* p, the pointer p is constant not the character referenced by it.
So we can't assign p with other location but we can change the value of the character pointed by
p.
According to C standard, “ If the size of the space requested is zero, the behavior is
implementation defined: either a null pointer is returned, or the behavior is as if the size were
some nonzero value, except that the returned pointer shall not be used to access an object”. But
there is a benefit of this. The pointer return after malloc(0) will be valid pointer and can be
deallocated using free() and it will not crash the program.
Function pointer, as the name suggests, points to a function. We can declare a function pointer
and point to a function. After that using that function pointer we can call that function. Let's say,
we have a function Hello which has definition like this -
void Hello(int)
void (*ptr)(int);
Here, ptr is a function pointer that can point to function with no return type and one integer
argument. After declaration, we can point to function Hello like this -
(*ptr)(30);
19) Declare a function pointer that points to a function which returns a function pointer ?
#include<stdio.h>
void Hello();
typedef void (*FP)();
FP fun(int);
main()
{
FP (*ptr)(int) = NULL;
FP p;
ptr = fun;
p = (*fun)(30);
(*p)();
}
void Hello()
{
printf("Hello\n");
}
FP fun(int a)
{
FP p = Hello;
printf("Number is : %d\n", a);
return p;
}
In this program, we have a function Hello with no return type and no argument. The function fun
takes an integer argument and returns a function pointer that can point to Hello(). First we have
typdef the function pointer which can point to a function with no return type and argument with
identifier FP. That way it will be easier to define the required function pointer. If we avoid
typedef the required function pointer (ptr) will look like this -
void (*(*ptr)())(int)
In C when we use variable name to access the value it is direct access. If we use pointer to get
the variable value, it is indirection.
#include<stdio.h>
main ()
{
union Test
{
unsigned int i;
unsigned char c[2];
};
22) Write a program to get the higher and lower nibble of a byte without using shift
operator?
#include<stdio.h>
struct full_byte
{
char first : 4;
char second : 4;
};
union A
{
char x;
struct full_byte by;
};
main()
{
char c = 100;
union A a;
a.x = c;
printf(“the two nibbles are: %d and %d\n”, a.by.first, a.by.second);
}
23) How can you determine the size of an allocated portion of memory?
Ans: We can’t. During malloc or calloc system maintains a list for the pointer allocated and
sizeof memory which is used during free(). This is not accessible to user.
#include<stdio.h>
#define SQUARE(x) (x)*(x)
main()
{
int i = 5;
printf('%d\n”, SQUARE(++i));
}
Answer will be 49. The macro will be expanded like (++i) * (++i). But the ++ operator has
higher precedence. So, the output will be 49.
We can use #ifdef and #undef preprocessors. It can be done like this -
#ifdef A
#undef A
#endif
#define A 10
Here if macro A is defined it will be undefined using undef and again defined using define.
The macro #line has the capability to change the current line number and optionally the file name
returned by the predefined macros __LINE__ and __FILE__. Here also the line number will be
incremented automatically after the value is changed using #line. For example, consider the
following program.
#include<stdio.h>
main()
{
printf("First: %d\n", __LINE__);
#line 0
printf("Second: %d\n", __LINE__);
printf("Third: %d\n", __LINE__);
}
First: 5
Second: 0
Third: 1
#include<stdio.h>
#define DO_SOMETHING(x)
int i;
for(i = 0; i < 10; i++)
x += i;
main()
{
int i = 0;
DO_SOMETHING(i);
printf("\n%d", i + printf("1"));
}
This program will generate an compilation error, as the integer variable i is declared twice. The
macro DO_SOMETHING will be replaced before the compilation and the result code will have
“int i” declaration twice in the program which will cause compilation error.
#include <stdio.h>
#include <stdio.h>
int main(void)
{
int a[5] = { 1, 2, 3, 4, 5 };
int *ptr = (int*)(&a + 1);
printf("%d %d\n", *(a + 1), *(ptr - 1));
return 0;
}
Here a has type array[5] of int, and &a has type pointer to array[5] of int. So, ptr will yield a
pointer to the array[5] of int that comes after a. Subtracting 1 from ptr will point to the last
element of a which is 5. Remember, here &a and &a[0] both will point to starting address of the
array or the address of the first element. But (&a + 1) points block of memory of size 5 times the
sizeof int that comes after the memory block of a, while (&a[0] + 1) return the address of the
second element.
#include <stdio.h>
int main(void)
{
int a, b, c, d;
a = 3;
b = 5;
c = a, b;
d = (a, b);
printf("c=%d ", c);
printf("d=%d\n", d);
return 0;
}
Output - 3 5
The comma in C is both a separator as well as an operator. Also, comma operator has the least
precedence. In the assignment operation of c, the comma has less priority that assignment
operator. So, c = a, b actually evaluates to (c = a), b. But in case of assignment of variable d, the
comma operator evaluates both of its operands and returns the value of the second. So, d = (a, b)
is equivalent to d = b.
#include<stdio.h>
void main()
{
int const * p=5;
printf("%d",++(*p));
}
This program will give a compiler error: Cannot modify a constant value. Here p is a pointer to a
"constant integer". But in the printf function, we tried to change the value of the "constant
integer" which is not allowed in C and thus the compilation error.
32) Print the output of this data comparison C program?
#include<stdio.h>
main()
{
float me = 1.1;
double you = 1.1;
if(me==you)
printf("I love U");
else
printf("I hate U");
}
Output is "I hate U"
For floating point numbers (float, double, long double) the values cannot be predicted exactly.
Depending on the number of bytes, the precession with of the value represented varies. Float
takes 4 bytes and long double takes 10 bytes. So float stores 0.9 with less precision than long
double. So comparing them will result false and thus the “I hate U' string is printed. It is better to
avoid comparing different type of floating point numbers.
33) Guess the output of the backspace and carriage return C program?
#include<stdio.h>
main()
{
printf("\nab");
printf("\bsi");
printf("\rha");
}
Output is "hai"
The “\b” in C represents backspace and \r carriage return. The “\b” will erase the last character
printed in the output. So, the first printf feed a newline character and then prints ab. The second
printf first erases b from ab and then prints si. Until now the output is asi. The third printf
encounters the “\r” and move the cursor back to the beginning of the line and then prints ha
overwriting the as of the asi. So, the final output will be hai.
The function will lead to stack overflow. Here, there is no terminating condition and that is why
it leads to infinite recursion which results in STACK OVERFLOW. When a function is called,
Here without proper termination condition, the recursion will continue and the memory is
allocated for all the recursion instances. After certain time the memory allocated for the
programs stack will be full and it will cause stack overflow.
#include<stdio.h>
main()
{
char s[] = "Hello world";
int i = 7;
printf("%10.*s", i, s);
}
In this program the format specifier is a bit different from normal %s. After the “%” operator the
10 forces to print minimum 10 characters to be printed in output. The “.*” followed by that takes
an integer argument and represents the number of characters to be printed from the string
followed. So, the argument i with value 7 forces to print first 7 characters of the variable s. The
remaining 3 characters are filled by preceding blank spaces.
36) Guess the condition in place of X which lead to print “Hello world” as output?
if(X)
{
printf(“Hello”);
}
else
{
printf(“ world”);
}
if(!printf(“Hello”)
{
printf(“Hello”);
}
else
{
printf(“ world”);
}
The printf(“Hello”) in if condition is executed and will print “Hello” in the output and this printf
will return number of characters printed i.e. 5. The preceding “!” will turn it 0 which will cause
the if condition to fail and execute the printf statement in else block.
printf(“%d”, (int)sizeof('A'));
The output will be same as sizeof(int). In case 64 bit machine it will be 4. The sizeof operator
will change the 'A' to its ASCII value and to the sizeof operator that ASCII value is nothing but
an integer.
#include<stdio.h>
main()
{
int i=5;
printf("%d%d%d%d%d%d", i++, i--, ++i, --i, i);
}
Output of this program is 45545. The arguments in any function call are pushed into the stack
from left to right order. During evaluation those arguments are popped out from the stack. So,
ultimately. the evaluation is from right to left. So, the last argument will result 5, the next one
will result 4 and also the variable i at that point will hold 4. The next one is again 5 and after that
it is again 5 as it is post decrement. The first one will return 4 and turn the value of i to 5.
Program will produce the output - 64. The macro call square(4) will substituted by 4*4 and the
expression becomes i = 64/4*4 . Since / and * has equal priority the expression will be evaluated
based on the associativity which is left to right. So, 64/4*4 will be equal to (64/4)*4 i.e. 16*4 =
64.
#include<stdio.h>
struct A
{
int i;
char str[10];
float f;
};
main()
{
struct A a = {4};
printf("%d %s %f\n", a.i, a.str, a.f);
}
The program will print 4 0.0000. In C, when a structure variable in partially initialized, other
members of that variables will be initialized to 0 or NULL. Here, a.str will be initialized to
NULL and a.f will be initialized to 0.0000.
#include<stdio.h>
main()
{
static int a[5];
int i = 0;
a[i] = i++;
printf("%d %d\n", a[0], a[1]);
}
Output - 0 0. The static storage class will initialize all the elements of the array to 0. The 2nd
element i.e. element with index 1 will be populated with 0 as the increment is post increment. So,
the output will be 0 0.
main()
{
char c;
printf(“Size of c is %d”, sizeof c);
}
Output of this program is "Size of c is 1". Sizeof is an operator not function. So, sizeof
<variable_name> is a valid statement. But sizeof int is not. It will give you compilation error.
Better to use sizeof(<variable_name/data_type>) i.e. enclosed in parenthesis.
Output is 12. The macro A will take two argument and paste them after word cou. So when we
called A(n,t), the macro will be replaced with count and print the value 12. Here ## in macro
pastes arguments and after replacement it ends up with variable name not value.
44) How to use scanf to get a complete line(i.e upto '\n') from input?
Use scanf(“%[^\n]”, str). [^\n] is a regular expression that means until '\n' is encountered.
main()
{
struct A
{
char a;
int i;
}a;
printf("%d",sizeof(a));
}
Output will be 8. The size should be (4 + 1) or 5 but the compiler adds padding and make its size
multiple of 4.
char fun()
{
char c = 'A';
printf("Hello World");
return c;
}
main()
{
printf("%d", sizeof(fun()));
}
Output is 1. Even if this is function pointer, the sizeof will get the return type and returns the size
of that data type. Here, the return type is char, so the output is 1.
Output will be "10 20". The %.0d forces compiler to print non negative values. As c is 0, it will
not be printed.
if(condition)
{
printf("Hello");
}
else
{
printf("world");
}
Condition will be fclose(stdout). It will close the stdout file handle and no output will be printed.
#include<stdio.h>
main()
{
int x = 'Aa';
printf("%#x", x);
}
Output of this program is "0x4161". The #x automatically adds 0x before the number and prints
the hexadecimal equivalent. The 'Aa' here is multi-character assignment. It means the i will hold
ascii value of these two characters in its two bytes. Thus the output is 0x4161.
#include<stdio.h>
main()
{
int array[] = {[0] = 1, [1] = 2, [2] = 3 };
printf("%d %d %d\n", array[0], array[1], array[2]);
}
The output will be 1 2 3. The above initialization technique is unique but allowed in C.
#include <stdio.h>
main()
{
int a[10] = {0,1,2,3,4,5,6,7,8,9};
printf(“%d”, 1[a]);
}
Output of this program is 1. The a[1] expression is equivalent to *(a + 1) and 1[a] is equivalent
to *(1 + a). Both of them are same. So, 1[a] will return the value of a[1].
#include <stdio.h>
main()
{
int i = 10;
while(i --> 0)
{
printf("%d ", i);
}
}
#include <stdio.h>
struct A
{
unsigned int i1 : 3;
unsigned int i2 : 4;
};
main()
{
struct A a = { 15, 63};
printf("%d %d\n", a.i1, a.i2);
}
Output of this program is "7 15". The : 3 or :4 in the structure definition means that i1 will be of
unsigned int type, but it will be 3 bit long and i2 will be 4 bit long. So, when we assign the value
15 to i1, it will only store the first 3 bits which will result value 7. Same goes for i2. The value of
i2 will be 15.
#include <stdio.h>
#define A(a,b) a##b
#define B(a) #a
#define C(a) B(a)
main()
{
printf("%s\n",C(A(1,2)));
printf("%s\n",B(A(1,2)));
}
In case of B(A(1,2)), A(1, 2) is stringize using # operator in g macro. So, the output is A(1,2) as
string. But in case of first printf, the A(1,2) is passed to macro g but before expanding macro B,
the A(1,2) macro is expanded. That is why the output of the first printf is 12.
55) What is the difference between void foo(void) and void foo()?
Ans: In C, void foo() means a function foo taking an unspecified number of arguments of
unspecified type and void foo(void) means a function foo taking no arguments. So, in case of
void foo(), if we call this function like foo(1,2,3), the compiler will not raise any error. But the
compiler will raise an error in case of void foo(void).
When a function is called in C, the caller pushes all of the arguments, in reverse order, into the
stack before calling the callee. Using foo() means that the compiler won't care to check the
arguments passed to foo. In case of foo(void), before calling the function compiler will
specifically check the number of arguments and will raise an error saying the mismatch between
number of arguments.
#include <stdio.h>
main()
{
int i = 10;
printf("sizeof(++i) is: %d\n", sizeof(++i));
printf("i : %d\n",i);
}
sizeof(++i) is: 4
i : 10
The sizeof operator is evaluated during compile time and also the expression inside sizeof is not
evaluated. The sizeof just takes the type of the expression. Here sizeof(++i) is same as
sizeof(int).
57) Print the output of this C program using Octel and Decimal?
#include <stdio.h>
main()
{
int a[] = {0001,0010,0100,1000};
int i;
Output
a[0] : 1
a[1] : 8
a[2] : 64
a[3] : 1000
The array elements are 0001,0010,0100,1000. As first three element has preceding 0, the
compiler will treat them as octal numbers. So, 0001 in octal is 1 in decimal; 0010 in octal is same
as 8 in decimal and 0100 in octal is equivalent to 64 in decimal. But the last element has no
preceding 0, so the last element will have value 1000.
#include<stdio.h>
main()
{
int a;
a = (int)sizeof(!2.3);
printf(“%d”, a);
}
Output is 4. The '!' operator takes an argument and return 1 if the value is 0 and 0 otherwise. So, !
2.3 is 0. To sizeof 0 is an integer and so the output is 4.
59) Print the output of C program given below using strlen and sizeof operator?
#include<string.h>
#include <stdio.h>
main()
{
printf("%d %d", sizeof("string"), strlen("string"));
}
Output is "7 6". The sizeof return the number of characters including the null character, but strlen
returns number of characters without null character.
The following function checks whether a linked list is circular or not and return 1 if true.
Otherwise it returns 0.
61) Guess the output of this C program having a pointer in the main function?
#include<stdio.h>
void func(int *a)
{
int x = 1;
a = &x;
}
main()
{
int i = 2;
int *p = &i;
func(p);
printf("%d", *p);
}
Output is 2. The pointer a in function func is a local copy of pointer p. So, even if we assign
another location to a, it will not be reflected on the p in main function. The p will point to
location of i and will print 2 as result.
Actually –> is not an operator. In fact, it’s a combination of two separate operators i.e. — and >.
To understand how “goes to” operator works, go through the below code snippet.
In the example, there is conditional’s code which decrements variable x, while returning x’s
original (not decremented) value, and then compares the original value with 0 using the >
operator.
int _tmain(){
int x = 10;
while( x –> 0 ) // x goes to 0
{
printf(“%d “, x);
}
printf(“\n”);
}
Output:
9876543210
Press any key to continue . . .
9. Scanf Magic
scanf(“%[^,]”, a); // This doesn’t scrap the comma
scanf(“%[^\n]\n”, a); // It will read until you meet ‘\n’, then trashes the ‘\n’