Char 和 Int 打印两个不同的值

Posted

技术标签:

【中文标题】Char 和 Int 打印两个不同的值【英文标题】:Char and Int printing two different values 【发布时间】:2020-12-06 19:09:26 【问题描述】:

我的代码正在读取一个包含整数的文件: 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 吗?我正在尝试将这些数字用作计数器的输入和二维数组中的位置。

【问题讨论】:

【参考方案1】:

你正在阅读 3 作为一个角色,.

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

如果你想要文字值,你可以使用类似的东西

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

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

【讨论】:

或者坚持使用 %c。这就是它首先存在的目的。为什么要跳过并非真正便携的篮球?【参考方案2】:

您的文件不包含整数 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编码。

【讨论】:

【参考方案3】:

字符根据encoding scheme 存储为整数。您的系统似乎使用了ASCII encoding set。每个字符都有各自的 ASCII 码整数值,它决定了该字符在内存中的存储方式。

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

这是标准 ASCII 集的列表:

当您使用printf("%c", c); 时,c 被读取为字符。由于c 包含字符'3',它打印字符值3

当你改用printf("%d", c);时,c被读取为整数,打印出来的不是3,而是它的相对ASCII码值,即51

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

如果要将此字符值转换为整数,可以使用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

【讨论】:

以上是关于Char 和 Int 打印两个不同的值的主要内容,如果未能解决你的问题,请参考以下文章

递归打印,没有任何循环

.编写Java应用程序。首先,定义一个Print类,它有一个方法void output(int x),如果x的值是1,在控制台打印出大写的英文字母表;如果x的值是2,在 控制台打印出小写的英文字母表。

Java中三元运算符中的char转换,打印int值而不是char值

编写Java应用程序。首先,定义一个Print类,它有一个方法void output(int x),如果x的值是1,在控制台打印出大写的英文字母表;如果x的值是2,在 控制台打印出小写的英文字母表。其

从 char 转换为 int 并打印十进制值

打印 char 2D 数组时初始化程序太多