当C中的输入为0时,为什么我的getc()总是返回30?

时间:2014-02-10 22:43:37

标签: c file io getc

int main(void){
    char buffer[5] = {0};  
    int i;
    FILE *fp = fopen("haha.txt", "r");
    if (fp == NULL) {
    perror("Failed to open file \"mhaha\"");
    return EXIT_FAILURE;
    }
    for (i = 0; i < 5; i++) {
        int rc = getc(fp);
        if (rc == EOF) {
            fputs("An error occurred while reading the file.\n", stderr);
            return EXIT_FAILURE;
        }
    buffer[i] = rc;
    }
    fclose(fp);
    printf("The bytes read were... %x %x %x %x %x\n", buffer[0], buffer[1], buffer[2], buffer[3], buffer[4]);
    return EXIT_SUCCESS;
}

我在我的haha.txt文件中放了8个0,当我运行这个代码时它总是给我:

  

读取的字节数为... 30 30 30 30 30

有人可以告诉我为什么吗?

3 个答案:

答案 0 :(得分:2)

因为'0'== 0x30

字符'0'是0x30(ascii)。

答案 1 :(得分:0)

您在文本文件中输入的

'0'被解释为char而不是int。现在,当您尝试在其char值中打印hex (%x)时,代码只会找到charhex的等效内容并打印出来。

那么,你的'0' = 0x30。您也可以尝试在文本文件中输入'A'并将其打印为十六进制,因为'A' = 0x41,您将获得'41'。 供您参考,AsciiTable

如果您想准确打印出在文字文件中输入的内容,只需更改printf("The bytes read were... %x %x %x %x %x\n", buffer[0], buffer[1], buffer[2], buffer[3], buffer[4]);

即可

printf("The bytes read were... %c %c %c %c %c\n", buffer[0], buffer[1], buffer[2], buffer[3], buffer[4]); 
/* %c will tell the compiler to print the chars as char and not as hex values. */

您可能需要阅读Format SpecifiersMSDN Link

答案 2 :(得分:0)

printf %x中使用hex,并在char '0'中打印。 48 in decimal等于0x30 in hex所以0 in char

要打印printf,您需要将%c与{{1}}

一起使用