如何解决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集的列表:
使用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');
因为数字0
至9
必然在编码中具有严格增加的序列值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。