【问题标题】:Char and Int printing two different valuesChar 和 Int 打印两个不同的值
【发布时间】: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 吗?我正在尝试将这些数字用作计数器的输入和二维数组中的位置。

【问题讨论】:

    标签: c char printf


    【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-17
        • 2016-07-20
        相关资源
        最近更新 更多