Char和Int打印两个不同的值

问题描述

我的代码正在读取包含整数的文件: 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 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编码。

,

根据encoding scheme,字符存储为整数。您的系统似乎使用了ASCII encoding set。每个单个字符都有各自的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
,

您正在将3读为字符。

在系统中,ASCII encoding之后,'3'的十进制值为51,因此当您打印读取的值时,它会打印51

如果您想要文字值,可以使用类似的

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

因为数字09必然在编码中具有严格增加的序列值。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...