将ascii转换为二进制时出现无限循环问题(C语言)

问题描述 投票:0回答:3

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

P。 S. 我正在使用哈佛 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 binary infinite-loop number-systems
3个回答
0
投票

问题是您在外循环和内循环中都使用了

i
。在第二个内循环结束时,
i
-1
,它由外循环增加到
0
。所以它只是一遍又一遍地处理第一个元素。对内部循环使用不同的变量。


0
投票

您多次重复使用

i
变量。

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

为每种用法赋予不同的、更有意义的标识符。


0
投票

在外循环中,您使用

i
来计算迭代次数。在两个内部循环中,您都覆盖
i
并将其重新用于 those 循环。你的最后一个内部循环向后计数到零:

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

因此,在这个循环之后,

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]);
}

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

© www.soinside.com 2019 - 2024. All rights reserved.