Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Putchar and Getchar in C

I'm reading K&R's The C Programming Language and have become confused on putchar and getchar. I made a program where you enter 10 chars and the program prints them back out to the screen.

#include <stdio.h>

int main() 
{
    int i;
    int ch;
    for(i = 0; i < 10; i++)
    {
        printf("Enter a single character >> ");
        ch = getchar();
        putchar(ch);
    }

    return 0;
}

I expected to get an output like this:

Enter a single character >> a
a
Enter a single character >> b
b

...and so on 10 times but this is the output I got: (I stopped after entering 2 chars)

Enter a single character >> a
aEnter a single character >>
Enter a single character >> b
bEnter a single character >>
Enter a single character >>

not sure why my input character is being combined with the fixed string and being output.

Also, I'm not too sure why ints are used to store characters.

like image 843
CS Student Avatar asked Oct 14 '13 19:10

CS Student


People also ask

What is the difference between getchar () and putchar () functions?

Here the getchar () function takes a single character from the standard input and assigns them to a ch variable. Whereas the putchar () function prints the read character. Let's consider a program to read a character using the scanf () library function in C. printf ( " You have entered %c", ch);

What does getchar () do in C?

That means, it can read only character value. For example, ch=getchar (); will read a single character from a console and store that character in the character variable ch. What is putchar in c language?

What is the difference between getchar() and printf() in C?

getchar () function reads character from keyboard. putc () function writes a character to file. putchar () function writes a character to screen. printf () function writes formatted data to screen. sprinf () function writes formatted output to string. scanf () function reads formatted data from keyboard.

How to read a string using getchar () in Python?

getchar () as the name states reads only one character at a time. In order to read a string, we have to use this function repeatedly until a terminating character is encountered. The characters scanned one after the other have to be stored simultaneously into the character array. Enter a string: Where have you e# #been?


3 Answers

putchar(ch);

just prints single character and the following printf continues within the same line. Simply add:

putchar('\n');

right after putchar(ch);, which will explicitly start the new line before the printf is executed. Additionally you should also take '\n' from the input which stays there after you enter the character:

for(i = 0; i < 10; i++)
{
    printf("Enter a single character >> ");
    ch = getchar();
    getchar();        // <-- "eat" new-line character
    putchar(ch);
    putchar('\n');    // <-- start new line
}
like image 60
LihO Avatar answered Oct 23 '22 15:10

LihO


You are not printing a new line. After putchar(ch); you should use putchar('\n'); to print a new line.

like image 32
clcto Avatar answered Oct 23 '22 15:10

clcto


User terminal can operate in canonical and non-canonical modes. By default it operates in canonical mode and this means that standard input is available to a program line-by-line (not symbol-by-symbol). In question user inputs something (let it be letter 'a', 0x61 in hex) and pushes enter (new line character '0x0A' in hex). Ascii table is here. So this action gives a two symbols to a program. As mentioned in man getchar() reads it symbol-by-symbol. So loop iterates twice for one character. To see what is going on use the following program (+loop counter output, +character code output):

#include <stdio.h>
#include <unistd.h>

int main() 
{
  int i;
  char ch;
  for(i = 0; i < 10; i++)
  {
    printf("Enter a single character %d >>", i);
    ch = getchar();
    printf("Ch=0x%08X\n", ch);
    /*putchar(ch);*/
  }

  return 0;
}

Output:

┌─(02:01:16)─(michael@lorry)─(~/tmp/getchar)
└─► gcc -o main main.c; ./main 
Enter a single character 0 >>a
Ch=0x00000061
Enter a single character 1 >>Ch=0x0000000A
Enter a single character 2 >>b
Ch=0x00000062
Enter a single character 3 >>Ch=0x0000000A
Enter a single character 4 >>^C

So program gets two symbols and prints them. And new line symbol is not visible. So in the question user see one strange additional line. Detailed description on different terminal modes and how to make its adjustments can be found here.

Also stty utility can be useful while working with terminal options ("icanon" tells if terminal use canonical mode or not).

And about storing chars as int in getchar() output - see my answer for similar topic.

like image 3
Michael Avatar answered Oct 23 '22 14:10

Michael