gpt4 book ai didi

c - Kernighan 和 Ritchie 练习 2-2 调试?

转载 作者:太空宇宙 更新时间:2023-11-04 05:42:01 25 4
gpt4 key购买 nike

我正在通过 K&R(第 2 版)进行 self 启发,遇到了以下练习(练习 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 语句以在 c == '\n' 时跳出外循环,但我仍然没有看到它!我也很难尝试运行 GDB,在命令行中输入文本并同时打印 c 的值,即使我试图将 gdb 链接到可执行文件的运行副本的 pid。我意识到可能还有其他方法可以解决这个问题,例如设置一个 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;输入命令行条目并打印 c 的值。将 gdb 链接到可执行文件的 pid 仍然没有按预期工作。我什至发布了 separate question关于 gdb。

最佳答案

but to my surprise it happily soldiers on

您有三个嵌套循环。换行符会终止其中一个内部循环,而最外层的循环会愉快地继续(直到您按下 Enter lim 次)。

我可以给你一个提示:你可能不应该为此使用嵌套循环。

关于c - Kernighan 和 Ritchie 练习 2-2 调试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15865404/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com