将 ASCII 转换为二进制时出现无限循环的问题(在 C 中)

Problem with infinite loop when converting ASCII to Binary (in C)

提问人:Nare Avetisyan 提问时间:7/30/2023 最后编辑:Jonathan LefflerNare Avetisyan 更新时间:7/31/2023 访问量:65

问:

我正在编写一个代码来将文本转换为 ASCII,然后转换为二进制。文本>ASCII 转换工作正常,但在 ASCII->二进制转换期间,我在运行程序时得到无限循环。我的代码的哪一部分是错误的?

附言我正在使用哈佛 CS50 课程提供的 cs50 库,因此是第四行。

const int BITS_IN_BYTE = 8;
int main(void)
{
   string text = get_string("Text: ");
   int binary[BITS_IN_BYTE];
   for (int i=0, len = strlen(text); i<len; i++)
   {
        int ascii = text[i];
        printf("%d\n", ascii);

        for(i=0; ascii>0; i++)
        {
            ascii = ascii / 2;
            binary[i] = ascii % 2;
        }
        printf("Binary for the given number is: ");
        for(i=i-1; i>=0; i--)
        {
            printf("%d", binary[i]);
        }
    }
}
C 二进制 无限循环 CS50 数字系统

评论

0赞 Jonathan Leffler 7/30/2023
除了在不应该重用的时候重用之外,我认为该语句应该在赋值之后,而不是之前。就这样,你扔掉了最不重要的一点。(哦,你把运算符写出来了。iascii /= 2;binary[i]/=

答:

0赞 Tom Karzes 7/30/2023 #1

问题是你同时用于外循环和内循环。在第二个内部循环的末尾,是 ,它被外循环递增为 。所以它只是一遍又一遍地处理第一个元素。为内部循环使用不同的变量。ii-10

0赞 Oddthinking 7/30/2023 #2

您多次重用该变量。i

你用它来表示“字符串中的索引”。 您用它来表示“正在读取的 ascii 字节的索引”。 您用它来表示“正在写入的 ascii 字节的索引”。

为这些用法中的每一种提供不同的、更有意义的标识符。

0赞 paddy 7/30/2023 #3

在外部循环中,用于计算迭代次数。在两个内部循环中,您可以覆盖并重新使用它用于这些循环。第二个内部循环向后倒数超过零:ii

for(i=i-1; i>=0; i--)
{
    printf("%d", binary[i]);
}

因此,在此循环之后,为 -1。然后,外部循环在下一次迭代中将其递增为零,该值与上一次迭代相同,因此您有一个无限循环。i

通常应避免重用循环变量。由于第二个内部循环依赖于第一个内部循环的计数,因此您可以这样做:

int bit = 0;
for(; ascii > 0 && bit < BITS_IN_BYTE; bit++)
{
    ascii = ascii / 2;
    binary[bit] = ascii % 2;
}
printf("Binary for the given number is: ");
for(bit = bit-1; bit >= 0; bit--)
{
    printf("%d", binary[bit]);
}

请注意,实际上没有必要有两个循环并将内容存储在一个数组中,只是为了获得此输出。但也许这是课程要求或其他什么。

评论

0赞 Fe2O3 7/30/2023
可能希望在计算和存储单个位之前获取 LSB。
1赞 Tom Karzes 7/30/2023
在第二个内部循环之后,是 ,而不是 。请记住,继续条件是 ,而不是 。只有在外部循环递增它之后,它才会回到 。i-10i>=0i>00