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');
因为数字0
到9
在编码中必然具有严格递增的序列值。
【讨论】:
或者坚持使用 %c。这就是它首先存在的目的。为什么要跳过并非真正便携的篮球?【参考方案2】:您的文件不包含整数 3 2 1 2 2 2 3
。
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,在 控制台打印出小写的英文字母表。其