我正在通过 K&R(第 2 版)进行自己的启发,并遇到了以下练习(练习 2-2 p42):
Write a loop equivalent to the following without using && or ||:
for (i=0; i<lim-1 && (c=getchar()) != '\n' && c != EOF; ++i)
s[i] = c;
这是我的解决方案:
#include <stdio.h>
/* write a loop equivalent to the following without using && or ||
for (i=0; i<lim-1 && (c=getchar()) != '\n' && c != EOF; ++i)
s[i] = c;
*/
int main()
{
int counter = 0, lim = 1000;
int s[lim], c;
while(counter < lim-1)
{
while((c = getchar()) != '\n')
{
while(c != EOF)
{
s[counter] = c;
}
}
counter++;
}
return 0;
}
我期待缩进循环,因此整个程序在遇到换行符 ( '\n'
) 或 EOF 字符(Ctrl-d
在我的 Linux 机器上)时会正常退出,但令我惊讶的是,它很高兴地坚持下去。我尝试使用 gdb 对其进行调试,但仍然无法弄清楚。
我没看到什么?
附录:我试图颠倒 while 循环执行的测试序列,并添加了一个 if 语句来打破外部循环 ifc == '\n'
但仍然没有看到它!c
即使我尝试将 gdb 链接到可执行文件的运行副本的 pid,我也难以尝试运行 GDB,在命令行中输入文本并同时打印 的值。我意识到可能有其他方法可以解决这个练习,例如设置一个OK_TO_EXECUTE
标志或变量,只有在所有三个条件都满足时才为真,但我对我似乎无法在看似简单的程序中找到错误的事实感到困扰. 这就是为什么我要回到K&R更彻底地阅读这本书并正确解决练习的原因。
重做代码(仍然错误!!!):
#include <stdio.h>
/* write a loop equivalent to the following without using && or ||
for (i=0; i<lim-1 && (c=getchar()) != '\n' && c != EOF; ++i)
s[i] = c;
*/
int main()
{
int counter = 0, lim = 1000;
int s[lim], c;
while((c = getchar()) != EOF)
{
if ( c == '\n')
break;
while(c != '\n')
{
while(counter < lim-1)
{
s[counter] = c;
counter++;
}
}
}
return 0;
}
解决了!- 我认为!我想我终于想通了。在我的重做解决方案中编写的内部循环仍将无限循环或至少循环直到lim
达到。我添加了中断语句,并认为我正在寻求解决方案。
不过,我仍在努力解决如何在这个问题上运行 gdb;输入命令行条目print
和c
. 将 gdb 链接到可执行文件的 pid 仍然没有按预期工作。我什至发布了一个关于 gdb的单独问题。