我正在编写一段代码,将文本转换为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]);
}
}
}
问题是您在外循环和内循环中都使用了
i
。在第二个内循环结束时,i
是 -1
,它由外循环增加到 0
。所以它只是一遍又一遍地处理第一个元素。对内部循环使用不同的变量。
您多次重复使用
i
变量。
您使用它来表示“字符串中的索引”。 您使用它来表示“正在读取的 ascii 字节的索引”。 您使用它来表示“正在写入的 ascii 字节的索引”。
为每种用法赋予不同的、更有意义的标识符。
在外循环中,您使用
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]);
}
请注意,实际上并不需要有两个循环并将内容存储在数组中,只是为了获得此输出。但也许这是课程要求或其他什么。