Vous êtes sur la page 1sur 31

1. scanf has a return type.

It returns an int indicating the number of fields(variables)


succesfully scanned.
Take an example:

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];

4. scanf("%*d %s",&str);//NOTICE THE %*d which ignores that specific

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

5. For a string str

scanf(“%s”,&str) and scanf(“%s”,str); makes no difference.

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.

%*d would exclude one integer.

%*f would exclude one float.

%*s would exclude one word.

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.

%5d would take an integer of at most 5 digits.

%5f would take a float type number of at most 5 digits or 4 digits and one “ . ” as input.

%5s would take a string of at most 5 non white-space characters 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);

If you write the following in the console:

Any combination: You are free to use any combination.


Then only “You are free to use any combination.” would be stored in str variable. Here,

“Any combination” this would be removed by `%*[^:]`

“: ” 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.

To learn more about scanf, visit here.

Special thanks to Nowroz Islam for helping me with the concepts.

English is not first language. So, if you find any mistake or have any suggestion feel free to
comment. Happy coding :)

Tip#1) – Macro to Get Array Size of Any Data Type

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.

#define NUM_OF(x) (sizeof (x) / sizeof (*x))

#define num(x) (sizeof (x) / sizeof (*x))

int _tmain(){

int number[10] = {1,1,1,1,1,1};


char *teststr[20] = {"","","","","","","","",""};

printf("Size of number[10] is %d\n", num(number));


printf("Size of teststr[20] is %d\n", num(teststr));
}
Size of number[10] is 10
Size of teststr[20] is 20
Press any key to continue . . .
Tip#2) – Calculate Elapsed Time

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;
}

Tip#3) – Smart Random Number Generator

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>

// At the beginning of main, or at least before you use rand()


srand(time(NULL));

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?

In C programming, the symbol (–>) doesn’t represent an 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 . . .

Tip#5) – Some Cool SCANF Tricks

Find out some of the unheard scanf tricks that you must know.

scanf(“%[^,]”, a); // This doesn’t scrap the comma


scanf(“%[^,],”,a); // This one scraps the comma
scanf(“%[^\n]\n”, a); // It will read until you meet ‘\n’, then trashes the
‘\n’
scanf(“%*s %s”, last_name); // last_name is a variable

Tip#6) – Call Functions at Program Termination

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");
}

int main(int argc, wchar_t* argv[])


{
atexit(bar);
atexit(foo);
return 0;
}

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.

Tip#7) – Initialize a 2-D Array with a Long List of Values

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"
}

Tip#8) – Add Any Numbers without “+” Operator

Bitwise operators can be used to perform the addition (+) operation as mentioned in below
example:

int Add(int x, int y)


{
if (y == 0)
return x;
else
return Add( x ^ y, (x & y) << 1);
}

Tip#9) – Swapping Two Variables without Any Temp Variable

There are three ways to do this which I’ve mentioned below.

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”.

So whenever you mistakenly write the following.

if ( 1 = x )

The compiler will complain and refuse to compile the program.

While it’s not possible if you are comparing two variables. For example, the expression

if (x == y)

can be miss written as

if(x = y)

Tip#11) – Quick Commenting

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.

You can utilize the C Preprocessor’s #if directive to circumvent this:

#if 0
/* This code here is the stuff we want commented */
if (a != 0) {
b = 0;
}
#endif

Tip#12) – Use of Conditional Operator

The Conditional operator is also known as the Ternary operator. We mostly use it in the
following form:
x = (y < 0) ? 10 : 20;

But in C++, you can also use it in the following manner:

(c < 0 ? a : b) = 1;

// If c < 0 then a = 1
// If c > 0 then b = 1

Tip#13) – Arrays and Pointers not Entirely the Same

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.

To prove this fact, let me show you an example.

int a[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int *b = a;

printf("%d\n%d\n", sizeof(a), sizeof(b));

And the output is (assuming size of int is 4 bytes and address size is 8
bytes) –
40
8

Tip#14) – Pointer to array and Array of Pointers.

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]);

It’s same as ptr1 (An array of int pointers).

Tip#15) – Log off computer Using C.


#include <windows.h>

int main(){
system("shutdown -l -f -t 00");
}

Summary – C Programming Tips and Tricks


While starting to write this article, we thought to present you with ten best of the C programming
tips but ended up in delivering 15 wonderful tips.

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.

1) What will be the output of printf(“%d”)?

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).

2) What is the return values of printf and scanf?

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.

3) How to free a block of memory previously allocated without using free?

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.

4) How can you print a string containing '%' in printf?

There are no escape sequence provided for '%' in C. To print '%' one should use '%%', like -

printf(“He got 90%% marks in math”);

5) What is use of %n in printf()?

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);
}

Above program will print 'Hello world 5 “ as Hello is 5 letter.

6) Swap two variables without using any control statement ?

We can swap variable using 2 methods. First method is as given below

#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);
}

Second method to swap variables is given below

#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

But in case of second structure -

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 -

#pragma startup fun


void fun()
{
printf(“In fun\n”);
}
main()
{
printf(“In main\n”);
}

The output of the above program will be -

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

9) What is rvalue and lvalue?

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.

10)How to pack a structure?

We can pack any structure using __attribute__((__packed__)) in gcc. Example -

typdef struct A __attribute __((__packed__))


{
char c;
int i;
}B;

We can also use, pragma pack like this -

#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.

11) How to convert a string to integer value?

We can convert a string to integer in two ways. Method 1:

int i = atoi(str);

Method 2:

sscanf(str, “%d”, &i);

12) Print the output of the following switch case program?

#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);
}
}

Above program will print -

first A: 10
second A: 10

15) Print the output of this pointer program?

#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.

17) What is the point of using malloc(0)?

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.

18) What is function pointer?

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)

The pointer to that function will look like -

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 -

void (*ptr)(int) = NULL;


ptr = Hello;

After that we can call that function like this -

(*ptr)(30);

19) Declare a function pointer that points to a function which returns a function pointer ?

To understand this concept, let us look at the following example.

#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)

20) What is indirection?

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.

21) Write a C program to check your system endianness?

#include<stdio.h>
main ()
{
union Test
{
unsigned int i;
unsigned char c[2];
};

union Test a = {300};


if((a.c [0] == 1) &&
(a.c [1] == 44))
{
printf ("BIG ENDIAN\n");
}
else
{
printf ("LITTLE ENDIAN\n");
}
}

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.

24) Guess the output or error:

#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.

25) How do you override a defined macro?

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.

26) Can math operations be performed on a void pointer?


No. Pointer addition and subtraction means advancing the pointer by a number of elements. But
in case of a void pointer, we don't know fpr sure what it's pointing to, so we don't know the size
of what it's pointing to. That is why pointer arithmetic can not be used on void pointers.

27) What does the macro #line do?

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__);
}

The output will be -

First: 5
Second: 0
Third: 1

28) Guess the output or error of the C program given below?

#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.

29) Print the output of this array pointer program ?

#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;
}

Output of this program - 2 5

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.

30) Print the output of this C program on operator precedence?

#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.

31) Print the output of value assignment to a C constant program?

#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.

34) Print the output of this recursive function C Program?

void add(int a, int b)


{
int c;
c = a + b;
add (1,1);
}

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,

 It will evaluate actual parameter expressions.


 It will allocate memory for local variables.
 It will store caller’s current address of execution.
 Then it executes rest of the function body and reaches end and returns to the caller’s
address.

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.

35) Print the output of this format specifier C Program?

#include<stdio.h>
main()
{
char s[] = "Hello world";
int i = 7;
printf("%10.*s", i, s);
}

Output of this program is "Hello w"

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”);
}

The program should look like this -

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.

37) What will be the output of the following piece of code?

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.

38) Print the output or error?

#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.

39) Print the output of this C program with math functions?

#define square(x) x*x


main()
{
int i;
i = 64/square(4);
printf("%d",i);
}

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.

40) Guess the output or error?

#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.

41) Print the output of this static storage class C program ?

#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.

42) Guess the output of this sizeof C program?

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.

43) Guess output of this C program on Macro?

#define A(x, y) cou##x##y


main()
{
int count = 12;
printf(“%d”, A(n,t));
}

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.

45) Print the output of this size multiplier C program?

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.

46) Print the output of this function pointer C program?

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.

47) Guess output or error:


#include<stdio.h>
main()
{
int a = 10, b = 20, c = 0;
printf("%d %d %.0d", a, b, c);
}

Output will be "10 20". The %.0d forces compiler to print non negative values. As c is 0, it will
not be printed.

48) Guess the condition so that neither Hello or world is 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.

49) Guess the output or error?

#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.

50) Guess the output of this variable initialization C program?

#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.

51) Guess the output of this C array program?

#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].

52) Print the output of this C program using "-->" operator ?

#include <stdio.h>
main()
{
int i = 10;
while(i --> 0)
{
printf("%d ", i);
}
}

Output - 9 8 7 6 5 4 3 2 1 0. The “-->” is no new operator. Rather than it is a trick to confuse


people. The compiler will translate (i --> 0) to ((i--) > 0) as C does not care about blank spaces.
The program will start printing from 9 because of the decrement and upto 0 as this is a post
increment.

53) Print the output os unassigned type C program?

#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.

54) Guess the output of this C program using "#" Operator?

#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.

56) Guess the output of Sizeof operator inside expression program?

#include <stdio.h>
main()
{
int i = 10;
printf("sizeof(++i) is: %d\n", sizeof(++i));
printf("i : %d\n",i);
}

Output is as given below

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;

for(i = 0; i < 4; i++)


{
printf("a[%d] : %d\n", i, a[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.

58) Guess the output of C program with '!' operator?

#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.

60) Write a program to check whether a liked list is circular or not?

The following function checks whether a linked list is circular or not and return 1 if true.
Otherwise it returns 0.

int IsCircular(node *head)


{
node *slow, * fast;
slow = head;
fast = head->next;
while(true)
{
if((NULL == fast) || (NULL == fast->next))
{
return 0;
}
else if((fast == slow) || (fast->next == slow))
{
return 1;
}
else
{
slow = slow->next;
fast = fast->next->next;
}
}
}

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.

8. Do you know “GOES TO-->” operator in C?

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(“%[^,],”,a); // This one scraps the comma

scanf(“%[^\n]\n”, a); // It will read until you meet ‘\n’, then trashes the ‘\n’

scanf(“%*s %s”, last_name); // last_name is a variable

10. Add numbers without ‘+’ operator

int Add(int x, int y)


{
if (y == 0)
return x;
else
return Add( x ^ y, (x & y) << 1);
}

Vous aimerez peut-être aussi