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? :confused:

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 )

okay thanks, :slight_smile:

---------- 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? :wall:

#include <stdio.h>

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

The first 16 characters of ASCII, including zero, are nonprinting control characters. The ASCII letter '0' is not the binary number 0. Try this:

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.

1 Like

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:

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

2 Likes

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 :slight_smile: 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 :slight_smile:

The C Standard requires:

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

1 Like

It would be non-printable control characters if you dumped it into the terminal raw. That's why you use printf("%d", num) to print it and don't dump it into the terminal raw.

But, they're all just numbers. What do they mean, is the question.

Read it raw from a terminal? It's going to be ASCII. Convert as appropriate.

You got int i=10; ? It's already a binary integer.

1 Like

Oh okay thanks, so how is the character set look like in bit pattern? We noe tat numeric value of 48 is stored as 01100000. How about '0' which hav a value of 48?
And where can i get tis ASCII character set list?

The binary value for an ASCII '0' looks like 01100000.

The binary value for a numeric 48 looks like 01100000.

You might notice a certain resemblance between the two... They're all just numbers. The question is, what do they mean.

You can get a list of the ASCII character set at the wikipedia page for ascii.

1 Like

Okay, i got it. How do u read the ASCII table?

Look for 48 in the 'dec' column, you'll find the character 0 there. The nonprinting characters are in a separate section above the printing section, in it you'll find many characters which aren't used in text these days(binary is another matter) as well as familiar things like tab, backspace, newline, and carriage return.

Here is a more abbreviated table which just lumps everything together.

1 Like

Haha, okay. I juz realized tat the chart in wikipedia is arranged in Hexadecimal form.

:confused: Wikipedia lists four different number bases in their chart, not just hex. It's just the same number represented four different ways.

Check the 'dec' column. You will see the arrangement is still the same.