Char和Int打印不同的值

5

我的代码正在读取一个包含整数的文件: 3 2 1 2 2 2 3

    FILE *fptr;
    fptr = fopen(argv[1], "r"); 
    if (fptr == NULL) 
    { 
        printf("Cannot open file \n"); 
        exit(0); 
    } 

    int c = fgetc(fptr); 
    printf("%c", c);

    fclose(fptr);

这将按预期输出第一个数字3,但在将其用作整数时

printf("%d", c);

它输出了51?我试图将这些数字用作计数器的输入和2D数组中的位置。

3个回答

3

你的文件中不包含整数 3 2 1 2 2 2 3

  • 它包含一串比特流。
  • 8个比特可以被分组在一起,这种分组被称为字节。
  • 这些字节由一个字符编码解释(最可能是ASCII或UTF-8),以表示字符3 2 1 2 2 2 3

字符编码是字节模式和它们所关联的字符之间的映射。例如,UTF-8规定,11111111 000000000 10011111 10011000 10000011映射到Unicode字符1F603,“微笑着张嘴”:

你刚刚看到的是你的文件的第一个字节是00110011,这是字符'3'的ASCI编码。


1

字符根据编码方案以整数形式存储。您的系统似乎使用ASCII编码集。每个字符都有一个对应的ASCII代码整数值,该值确定了如何在内存中存储该字符。

'1' 的ASCII值为49'2' 的ASCII值为50'3' 的ASCII值为51

以下是标准ASCII集的列表:

ASCII-Table

当您使用printf("%c", c);时,c被读取为字符。由于c保存了字符'3',它会打印出字符值3
如果您使用printf("%d", c);c将被读取为整数,打印的不是3,而是它的相对ASCII码值,即51

我正在尝试将这些数字用作计数器的输入和2D数组中的位置。

如果您想将此字符值转换为整数,可以使用c - '0'并将其分配给另一个变量:
int c = fgetc(fptr); 
int i_c = c - '0';

printf("%d", i_c);

或者回到c

int c = fgetc(fptr); 
c = c - '0';

printf("%d", c);

在两种情况下输出:
3

0

你正在将字符3读取为一个字符。

在该系统中,根据ASCII编码,字符'3'的十进制值为51,因此当您打印读取的值时,它会打印51

如果您想要字面值,可以使用类似以下的内容

 printf("%d", c- '0');

由于数字 09 在编码中具有严格递增的序列值,因此如此。


或者只需坚持使用%c。这就是它最初的目的。为什么要跳过不真正可移植的障碍呢? - Mad Physicist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接