Thursday, May 14, 2015

Character counting in C using for loop !!!

Yesterday we learnt about "Character Counting in C"  using while loop. Today in order to illustrate the same character counting in C, we will trying using for loop. We will also try to use float or double datatype to store the character count.

Lets get started ....
 #include <stdio.h>  
 int main()  
 {  
   double char_count;  
   printf("\n Input characters to count \n");  
   for(char_count = 0; getchar() != '\n'; ++char_count);  
   printf("\n You have typed %.0f character :) \n",char_count);  
   return 0;  
 }  

Above program,

  • Declares char_count as doube instead of int to make sure that the count is not overflow while taking the input. double takes relatively more time to overflow than int.
  • Requests user to input characters
  • Reads character by character using getchar() till end of the line
  • As you can see, there is no body for for loop here because whole operation of character counting is done in for loop itself. This is the beauty of for loop.
  • for loop and while loop they check the condition first and enter their body to execute the code which provides the programmer more flexibility of programming.
  • Once a line is entered, program exits by printing the character count.
  • One important thing to note here while printing is "%.0f",  usually printf uses %f for printing float or double. Since char_count is decalared as double, we use "%.0f" to supress the decimal point  and fraction part which is zero.
Now output of this program is..
 mrtechpathi@mrtechpathi:~/Study/C/K_and_R$ ./a.out   
  Input characters to count   
 This is single line of input  
  You have typed 28 character :)   


It's very simple but very useful snippet while coding !!

Wednesday, May 13, 2015

Character Counting in C

Here we are taking baby steps in c. Lets learn how to count the number of characters entered through stdin (standard input like keyboard).

We will try to code the program similar to my earlier posts.
 #include <stdio.h>  
 int main()  
 {  
   int c,count=0;  
   printf("Start your input \n");  
   c = getchar();  
   while(c != '\n')  
   {  
     putchar(c);  
     c = getchar();  
     ++count;  
   }  
   printf("\n Number of characters entered = %d\n",count);  
 }  

Though we can code above snippet in much simpler form, I have used my earlier programs code to count the number of characters in c.

From above program,
  • In a while loop, we take input from stdin
  • output the characater to stdin
  • read character
  • pre-increment the count value
  • Continue in the while loop till new line
  • When new line is encountered, we print the stdout and number of characters
Output of this program is below
 mrtechpathi@mrtechpathi:~/Study/C/K_and_R$ ./a.out   
 Enter Ctrl+C is to exit  
 Start your input   
 just a single line input  
 just a single line input  
  Number of characters entered = 24  
Note that we are printing the characters and number of characters when new line or carriage return is encountered.

About EOF (End of file) in C

Have you ever wondered what is EOF in "Exiting c program right after reading one line or after carriage return while reading input from stdin".

EOF (End of the file) is a macro which expands to an integer constant expression with type int and an implementation dependent negative value but is very commonly -1.

Below is a small snippet to print EOF in c.
 #include <stdio .h="">  
 int main()  
 {  
 printf("\n Value of EOF is %d\n",EOF);  
 return 0;  
 }  

Output of this program is:

 mrtechpathi@mrtechpathi:~/Study/C/K_and_R$ ./a.out   
  Value of EOF is -1  

Exiting c program right after reading one line or after carriage return while reading input from stdin

Yesterday, we learnt about "C program that copies its input to its output one character at a time" , if you observe the program mentioned in this post, you will observe that we are taking the input from stdin (standard input) and outputting to stdout (each line) till EOF (End of the file) is reached.

Ideally stdin EOF is like forever. So, we end up pressing Ctrl+C to exit the program. Now to modify this program to exit right after one line or after a carriage return, we need to do a simple modification.
Replace EOF with '\n'. Yes its as simple as that.

 #include <stdio.h>  
 int main()  
 {  
   int c;  
   printf("Program exits after new line or carriage return \n");  
   printf("Start your input \n");  
   c = getchar();  
   while(c != '\n')  
   {  
     putchar(c);  
     c = getchar();  
   }  
 }  

Only difference you observe is in the while condition, "while(c != EOF) is changed to while(c != '\n')".

Output will be as below.

 mrtechpathi@mrtechpathi:~/Study/C/K_and_R$ ./a.out   
 Enter Ctrl+C is to exit  
 Start your input   
 just one line input  
 just one line input  
Hope you understood this simple concept !!!

Tuesday, May 12, 2015

C program that copies its input to its output one character at a time

I have been blogging few interesting how-to articles which I learn in my daily professional life. Its been a while I haven't blogged any.So, thought of just adding atleast a program per day (very challenging isn't ?) along with how-to articles.

I will start with C-programming. As everyone know "Kernighan & Ritchie" (K&R) is the best book to learn C programming. I will using examples in this book.


If you want any C snippet meanwhile, just drop me a comment will try and get it done for you.  I cant promise, but will try my best to do code for you.


Frist lets start with "C program that copies its input to its output one character at a time"


 #include <stdio.h>  
 int main()  
 {  
   int c;  
   printf("Enter Ctrl+C is to exit\n");  
   printf("Start your input \n");  
   c = getchar();  
   while(c != EOF)  
   {  
     putchar(c);  
     c = getchar();  
   }  
 }  

Above program is exact copy of a program in K&R, I have just added two printf statements to it.

When you compile and run this program, it accepts whatever the character you input from the keyboard and print them once you press enter (new line / carriage return).

It does this task forever because we have used "While( c != EOF )" in our above code snippet.
This while statements will be true till you reach EOF of stdin (standard input) which is forever.

So, in order to exit from running your program, you need to press "Ctrl+C" on your keyboard together.

Now lets run and see, output will be as below
 mrtechpathi@mrtechpathi:~/Study/C/K_and_R$ ./a.out   
 Enter Ctrl+C is to exit  
 Start your input   
 we are  
 we are  
 trying to print  
 trying to print  
 character by character  
 character by character  
 ^C  
Hope you learnt something new :).

Set auto Indentation , shiftwidth and tab stop in Vim forever !!!

If you are looking for enabling auto indentation and to set tabstop to x characters, you are in right  place.

Open your .vimrc under your "/home/<user>" directory and add below lines
 filetype plugin indent on  
 set tabstop=4  
 set shiftwidth=4  
 set expandtab  
In above settings we have set 4 as tabstop and shiftwidth.
Now open a file with vim and your indentation and tabstop will work as expected.

Wednesday, April 15, 2015

How Linux Memory is Managed - Part 1

To make virtual memory concept simple, we need to remember few basic ground rules.

1. Linux visualizes its physical resource of memory
2. Process never ever directly address physical memory.
3. Instead Kernel associates each process with unique address space.

Memory Management happens in Linux using Page and Paging.

Kernel allocates unique Virtual Address Space to each Process. This Virtual Address Space is composed of Pages.

Two type of Pages we have
1. Valid  Page : Its associated with Physical Page or Secondary storage like disk.
2. Invalid Page : Its unused, unallocated piece of  Address space.

A program cannot use a page in secondary storage. It can use the page if it is associate with a page in physical memory.

Program -> Tries to access a Page on Secondary Storage -> MMU  generate Page fault->  Kernel does Page-in the desired page from secondary storage to Physical memory.

Imagine a Process tries to access a page on secondary storage. 

Since the page is not present, page fault occurs.

The Kernel intervenes and does Page-in the desired page to Physical memory from Secondary storage.