What is the difference between printf and putchar() or scanf and getchar() ?


 
Thread Tools Search this Thread
Top Forums Programming What is the difference between printf and putchar() or scanf and getchar() ?
# 1  
Old 12-03-2012
What is the difference between printf and putchar() or scanf and getchar() ?

Im a newbie to programming language, i found tat there r these function called printf and putchar() as well as scanf and getchar(), im curious abt why do dey hav these 2 different function although dey r doing the same instruction? Smilie
# 2  
Old 12-03-2012
printf lets you format strings in a complicated way, substituting things like integers and floats and other strings.

getchar and putchar get and put characters.

See their respective manual pages ( man 3 printf man 3 putchar )
# 3  
Old 12-03-2012
okay thanks, Smilie

---------- Post updated at 09:57 AM ---------- Previous update was at 09:36 AM ----------

btw i still hav a question abt tis program, it is a program to count then number of occurrences of each digit. At the "while" part, why shud we nid to put [c-'0'] and not [c] for the ++ndigit to execute tis program? Smilie
Code:
#include <stdio.h>

int main()
{
	int i, c;
	int ndigit[10];
	for (i = 0; i < 100; ++i)
		ndigit[i] = 0;
	
	while ((c = getchar()) != EOF)
		++ndigit[c-'0'];
		
	printf("digits =");
	for (i = 0; i < 10; ++i)
		printf(" %d", ndigit[i]);
}

# 4  
Old 12-04-2012
The first 16 characters of ASCII, including zero, are nonprinting control characters. The ASCII letter '0' is not the binary number 0. Try this:

Code:
printf("%d\n", 0);
printf("%d\n", '0');

It's actually 48, you see. It's not a real number, just a code representing a letter on the screen. To get a real number out you have to translate.

The ASCII characters 0 1 2 3 4 5 6 7 8 9 are conveniently in order, probably designed that way. So subtracting '0' from '0' gets 0, subtracting '0' from '1' gets 1, and so forth.
This User Gave Thanks to Corona688 For This Post:
# 5  
Old 12-04-2012
Quote:
Originally Posted by kris26
okay thanks, Smilie

---------- Post updated at 09:57 AM ---------- Previous update was at 09:36 AM ----------

btw i still hav a question abt tis program, it is a program to count then number of occurrences of each digit. At the "while" part, why shud we nid to put [c-'0'] and not [c] for the ++ndigit to execute tis program? Smilie
Code:
#include <stdio.h>

int main()
{
	int i, c;
	int ndigit[10];
	for (i = 0; i < 100; ++i)
		ndigit[i] = 0;
	
	while ((c = getchar()) != EOF)
		++ndigit[c-'0'];
		
	printf("digits =");
	for (i = 0; i < 10; ++i)
		printf(" %d", ndigit[i]);
}

In addition to what Corona688 has already said, I need to comment on other aspects of your program. Any results that you get from this code are unreliable and suspect. First let me add line numbers to your C code for reference in the remainder of my comments:
Code:
 1 #include <stdio.h>
 2
 3 int main()
 4 {
 5	int i, c;
 6	int ndigit[10];
 7	for (i = 0; i < 100; ++i)
 8		ndigit[i] = 0;
 9	
10	while ((c = getchar()) != EOF)
11		++ndigit[c-'0'];
12		
13	printf("digits =");
14	for (i = 0; i < 10; ++i)
15		printf(" %d", ndigit[i]);
16 }

If you would move line 6 to come after line 1 but before line 3 (making the array global instead of local) or if you would declare the array to be static, the array would be guaranteed to be initialized to 0 without needing the for loop on lines 7 and 8 to initialize the array.

Clearing the 1st 100 elements of an array of 10 elements (as you do on lines 7 and 8) will overwrite other data in your address space (or attempt to write into unallocated space causing your program to crash). You might be lucky and not overwrite anything useful, but once you try to set ndigits[10] to 0 the results of this program are undefined. On some combinations of hardware architecture and C compiler design it would be common for this construct to overwrite the value of i while processing this loop (thereby turning lines 7 and 8 into an infinite loop).

You are reading data from an unknown source. If there is any character read from standard input by this program that is not a numeric digit, if an end-of-file condition is detected by getchar() while it tries to read 100 bytes from standard input, or if an error is detected while getchar() tries to read 100 bytes from standard input, you will again try to modify an integer value that is outside space allocated to the ndigits[] array. If that happens, the behavior of your program is undefined.

Most applications like this one produce text files that can be processed reliably by all of the UNIX/Linux text processing utilities. Since this program does not terminate its output with a <newline> character, the output is not a text file. If the output is just intended to be viewed by a human at a terminal, that might not be a problem, but the user will be disappointed to see that the shell prompt for the next command to be run starts in the middle of a line (possibly making the count you report for the number of '9' characters found ambiguous depending on the value of you shell's current setting for its command prompt).

I don't want to scare you off from programming, but realize that programming is an art and a science. Attention to tiny details is crucial when writing programs.

Last edited by Don Cragun; 12-04-2012 at 01:37 PM.. Reason: fixed 2 typos
These 2 Users Gave Thanks to Don Cragun For This Post:
# 6  
Old 12-04-2012
Thanks, Corona and Don.

Don, while i was reading ur reply to figure out my mistake, i realize tat i<100 was juz a typo, i wanted to set it i<10. Btw, thanks for tis new lesson Smilie I wont quit programming, i feel it is fun to solve problem.

Corona, so i hav check out tis ASCII character set, yea i found tat 1st 16 character of ASCII character r non printable control characters. I wonder if 0 = 0, 1 = 1, 2 =2 and so forth, and '0' = 48, why will it bcome 1 when we minus '1' - '0' and not a non printable control characters? If we add '0' to 1, will it bcome bak '1' or as u said '0' = 48 and bcome 49?? How do dey differentiate it is a character set or an integer??

Sorry everyone who r trying to reply me. I feel tat im annoying, i hope tat u all don mind to answer my question Smilie
# 7  
Old 12-05-2012
Quote:
Originally Posted by kris26
Thanks, Corona and Don.

Don, while i was reading ur reply to figure out my mistake, i realize tat i<100 was juz a typo, i wanted to set it i<10. Btw, thanks for tis new lesson Smilie I wont quit programming, i feel it is fun to solve problem.

Corona, so i hav check out tis ASCII character set, yea i found tat 1st 16 character of ASCII character r non printable control characters. I wonder if 0 = 0, 1 = 1, 2 =2 and so forth, and '0' = 48, why will it bcome 1 when we minus '1' - '0' and not a non printable control characters? If we add '0' to 1, will it bcome bak '1' or as u said '0' = 48 and bcome 49?? How do dey differentiate it is a character set or an integer??

Sorry everyone who r trying to reply me. I feel tat im annoying, i hope tat u all don mind to answer my question Smilie
The C Standard requires:
Quote:
In both the source and execution basic character sets, the value of each character after 0 in the above list of decimal digits shall be one greater than the value of the previous.
The reference to the above list is the list of the ten decimal digits starting with 0 and followed in order the by the digits 1 through 9. In a C source program an integer valued decimal digit will never appear in quotes; the code representing the character zero will be in single quotes (e.g., '0') and the code representing the character zero when it is part of a string of characters will be in double quotes (e.g., "0369").

In ASCII the character '0' has decimal value 48 (as you already know). In EBCDIC the character '0' has decimal value 240. If you want to write code that will only work when using code sets with an ASCII base, you can convert convert a character c that represents one of the decimal digits to the corresponding decimal value using c - 48. If you want to write code that will only work when using an EBCDIC code set, you can use c - 240 for the same conversion. If you want to right an expression that will work with portably with ASCII, EBCDIC, or any other codeset supported for use by C on your system, you can use c - '0'.

Note that in C, '0' is a character but is also an integral value that can be used in an arithmetic expression. The integer constant 3 always has decimal value 3. The integer constant '3' has a decimal value that varies depending on what character set is being used. The integer value of the byte in a string that contains the character '6' has the same decimal value of the integer constant '6' which will alway be 6 more than the decimal value of the integer constant '0'.
This User Gave Thanks to Don Cragun For This Post:
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

What's the difference between print and printf in command?

For example, in this command: ls /etc/rc0.d/ -print ls /etc/rc0.d/ -printfThe outputs are quite different, why? (7 Replies)
Discussion started by: Henryyy
7 Replies

2. Programming

How to kill disowned process which calls getchar() in code

Hi, What happens to process state when getchar() is called? I wrote a C code in which I call getchar() somewhere down the road. I forgot about that, I started the process, put it in bg and disowned it using "disown". Now, how do I see where that process has gone/how do kill it? Thanks, Amrut (1 Reply)
Discussion started by: 17amrut29
1 Replies

3. Programming

Help on getchar

I wanted to make a simple program that writes chracters in a file but i didnt want to press enter .So i found the getchar which doesnt need enter.If i pass (int) getchar to putc ,in the file it shows a P character.The (int) getchar says it is equal to1734747216 so i do (int) getchar-1734747216... (4 Replies)
Discussion started by: fireblast
4 Replies

4. Programming

How to skip getchar in C?

Hi, I would like to read an input from keyboard using getchar. However, if no input (No Carriage return/new line none whatsoever) is given after say, 5 seconds, I would like to skip the getchar and move on. How do I do this in C. I'm using GNU compiler set. Thanks, (5 Replies)
Discussion started by: cprogdude
5 Replies

5. Programming

Better than scanf

I don't know how to do this: printf("creazione nuovo messaggio\n"); printf("insert dest\n"); scanf("%s",dest); printf("insert object\n"); scanf("%s",ogg); printf("inserire text\n"); scanf("%s",test); ... (7 Replies)
Discussion started by: italian_boy
7 Replies

6. Shell Programming and Scripting

Bash replacement to getchar

There's a replacement in bash for getchar or get functions of C and C++?Those functions read the next char avaliable in the input stream. I've tried something like: OLD_STTY=`stty -g` stty cbreak -echo look=`dd if=/dev/tty bs=1 count=1 2>/dev/null` stty $OLD_STTY But it is not working... (3 Replies)
Discussion started by: Asafe
3 Replies

7. Programming

diff in putchar(c) and printf("%c",c);

hi all , could any tell me the diffrence between main() { char c='h'; printf("%c",c); } and main() { char c = 'h'; printf("c",putchar(c)); } (2 Replies)
Discussion started by: useless79
2 Replies

8. Programming

problem with scanf

hi all! i've written a simple c program: #include<stdio.h> #include<stdlib.h> int main() { int a; char b; char c; ... (4 Replies)
Discussion started by: mridula
4 Replies

9. Programming

scanf with strings... please help

hi i am a beginner to C i have encountered a problem with my assignment, and i have researched it on the internet, but unfortunately i didn't find anything related to that. i am writing a simple program that takes user's input by prompt command, and parse the whole line into an array of... (1 Reply)
Discussion started by: inkfish
1 Replies

10. UNIX for Dummies Questions & Answers

getchar()

hey everyone! got another problem here. how would i use the getchar() in a prompt: Press any key to continue the way i did it was to define a char variable named ch and then wrotechar ch ... ch = getchar(); printf("Press any key to continue"); getchar():if you press enter it exits, but... (2 Replies)
Discussion started by: primal
2 Replies
Login or Register to Ask a Question