c - 打印语句更改字符数组输出

标签 c arrays char printf

我正在尝试将一些文本(逐个字符)转换为其二进制表示形式。出于某种原因,打印语句 printf("Hold is %d or %c: ", hold, hold); 正在改变我函数的输出,我不知道如何解释它。任何帮助将不胜感激。测试文件只是一个文本文件,其中包含 Hello, World!

有了它:

Hold is 72 or H: 01001000
Hold is 101 or e: 01100101
Hold is 108 or l: 01101100
Hold is 108 or l: 01101100
Hold is 111 or o: 01101111
Hold is 44 or ,: 00101100
Hold is 32 or  : 00100000
Hold is 87 or W: 01010111
Hold is 111 or o: 01101111
Hold is 114 or r: 01110010
Hold is 108 or l: 01101100
Hold is 100 or d: 01100100
Hold is 33 or !: 00100001

没有它:

1000 �
0101 �
1100 �
1100 �
1111 �
1100 �
0000 �
0111 �
1111 �
0010 �
1100 �
0100 �
0001 �

代码

#include <stdio.h>
#include <string.h>

void decimal_to_binary(unsigned long num, FILE *out) {    
    int i = 255, a = 0;
    char binarr[255];
    for (i = 0; i < 255; i++) { binarr[i] = '0'; }
    if (num != 0) {
        while (num != 0) {
            if (num % 2 == 0) {
                binarr[i] = '0';
                i--;
            } else {
                binarr[i] = '1';
                i--;
            }
            num /= 2;
        }
    } else {
        fprintf(out, "00000000");
    }
    fprintf(out, "%s ", binarr + strlen(binarr) - 8);
    printf("%s\n", binarr + strlen(binarr) - 8);
    memset(binarr, 0, sizeof(binarr));    
}

int main(int argc, char *argv[]) {
    int hold;
    FILE *in = fopen(argv[1], "r");
    FILE *out = fopen(argv[2], "w+");

    while (!feof(in)) {
        hold = fgetc(in);
        if (hold > 0 && hold != 10){
            printf("Hold is %d or %c: ", hold, hold);
            decimal_to_binary(hold, out);
        }
    }
    fclose(in);
    fclose(out);
    return 0;
}

最佳答案

您的decimal_to_binary 函数不正确:

  • 你的索引超出了 binarr 数组的末尾。
  • 您不会以 null 终止此数组以将其传递给 printf

这是一个更简单且更正的版本:

void decimal_to_binary(unsigned long num, FILE *out) {
    int i = 256, a = 0;
    char binarr[257];
    memset(binarr, '0', sizeof(binarr) - 1);
    binarr[i] = '\0';
    while (num != 0) {
        --i;
        if (num % 2) {
            binarr[i] = '1';
        }
        num /= 2;
    }
    if (i > 256 - 8) // print at least 8 bits
        i = 256 - 8;
    fprintf(out, "%s ", binarr + i);
    printf("%s\n", binarr + i);
}

你的函数 main 也有问题:

  • 您使用 feof(in) 测试文件结尾。这是不正确的,您应该检查 hold 是否为 EOF
  • '\n' 的值硬编码为 10 是不好的做法。

这是一个正确的版本:

int main(int argc, char *argv[]) {
    int hold;
    FILE *in = fopen(argv[1], "r");
    FILE *out = fopen(argv[2], "w+");

    while ((hold = fgetc(in)) != EOF) {
        if (hold != '\n') {
            printf("Hold is %d or %c: ", hold, hold);
            decimal_to_binary(hold, out);
        }
    }
    fclose(in);
    fclose(out);
    return 0;
}

关于c - 打印语句更改字符数组输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34971524/

相关文章:

c - 在 C 中对动态分配的可变长度字符串数组进行排序

c - 对数组结构中的数据进行排序

c++ - 未初始化的数据和 memcpy

c - C中的细粒度锁定

c - 如何在 C 中防止 WinSock 上的空输入

c - Socket编程——将Windows代码转换成linux代码

ios - 如何在Swift中从JSON对象删除属性(key:values)

c - 为什么 const a + const b 不是 const 本身?

java - Java中的递增字符类型

java - 逐字符比较java中的两个字符串