简体   繁体   中英

Format Specifiers in C and their Roles?

wrote this code to "find if the given character is a digit or not"

#include<stdio.h>
int main()
{
    char ch;
    printf("enter a character");
    scanf("%c", &ch);
    printf("%c", ch>='0'&&ch<='9');
    return 0;
}

this got compiled, but after taking the input it didn't give any output. However, on changing the %c in the second last line to %d format specifier it indeed worked. I'm a bit confused as in why %d worked but %c didn't though the variable is of character datatype.

Characters in C are really just numbers in a token table. The %c is mainly there to do the translation between the alphanumeric token table that humans like to read/write and the raw binary that the C program uses internally.

The expression ch>='0'&&ch<='9' evaluates to 1 or 0 which is a raw binary integer of type int (it would be type bool in C++). If you attempt to print that one with %c , you'll get the symbol table character with index 0 or 1, which isn't even a printable character (0-31 aren't printable). So you print a non-printable character... either you'll see nothing or you'll see some strange symbols.

Instead you need to use %d for printing an integer, then printf will do the correct conversion to the printable symbols '1' and '0'


As a side-note, make it a habit to always end your (sequence of) printf statements with \n since that "flushes the output buffer" = actually prints to the screen, on many systems. See Why does printf not flush after the call unless a newline is in the format string? for details

在内存中, int 占用 4 个字节的内存,您试图将 int 值存储在一个字符中,如果您使用 %d,它将返回 ascii 值而不是 %c 中的 int 值,这将返回正在存储的 int 值在4字节内存的内存中。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM