提问人:Nare Avetisyan 提问时间:7/30/2023 最后编辑:Jonathan LefflerNare Avetisyan 更新时间:7/31/2023 访问量:65
将 ASCII 转换为二进制时出现无限循环的问题(在 C 中)
Problem with infinite loop when converting ASCII to Binary (in C)
问:
我正在编写一个代码来将文本转换为 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]);
}
}
}
答:
0赞
Tom Karzes
7/30/2023
#1
问题是你同时用于外循环和内循环。在第二个内部循环的末尾,是 ,它被外循环递增为 。所以它只是一遍又一遍地处理第一个元素。为内部循环使用不同的变量。i
i
-1
0
0赞
Oddthinking
7/30/2023
#2
您多次重用该变量。i
你用它来表示“字符串中的索引”。 您用它来表示“正在读取的 ascii 字节的索引”。 您用它来表示“正在写入的 ascii 字节的索引”。
为这些用法中的每一种提供不同的、更有意义的标识符。
0赞
paddy
7/30/2023
#3
在外部循环中,用于计算迭代次数。在两个内部循环中,您可以覆盖并重新使用它用于这些循环。第二个内部循环向后倒数超过零:i
i
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
-1
0
i>=0
i>0
0
上一个:如何从一个文件读取到另一个文件?
评论
i
ascii /= 2;
binary[i]
/=