问题标签 [kernighan-and-ritchie]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
132 浏览

c - 打印直方图时出现分割错误

好的,所以我想做这个问题:“编写一个程序来打印其输入中单词长度的直方图”(Brian 和 dennis ritchie 的《C 编程》一书的练习 1-13)。在这段代码中,我只打印各种字长的计数(作为我的第一次尝试)。

这个程序编译得很好,但是在运行代码时我得到了这个分段错误(代码转储)错误。这段代码有什么问题?

0 投票
2 回答
2629 浏览

c - 使用 int 从 getword 返回一个单词;binsearch 中可能出现的拼写错误

我终于完成了 K&R,但遇到了另一个不清楚的代码。第 6.3/6.4 章

  1. 参考getword。它怎么能返回int,这应该是一个词。我知道它返回 word[0] 是第一个字母。但是在我看来,如果我想返回一个词,我会引入类似 char *getword 的东西。我对吗?
    int 如何表示它是一个单词?

  2. 还是关于getword:假设我输入“in”并在空格后按回车键。getword 读取 'i' 因为它不是空格,而 isalpha 所以第一个 if 被省略。那会发生什么?

  3. 我在 binsearch 中标记了该行。你不认为它应该是高 = 中 - 1;那里?


0 投票
2 回答
868 浏览

c - 字符数组 c k&r 书 1-17

我正在研究 K&R,我试图编写一个程序来打印所有大于 80 个字符的输入行。一旦我从终端自己运行程序,我什么也得不到。谁能告诉我哪里出错了?还有一个我不确定的部分是这条线s[i] = '\0';- 有人可以向我解释一下这是做什么的吗?

0 投票
3 回答
1077 浏览

c - K&R C 编程语言 1.5.1(文件复制)

好吧,几个月前我读过另一本“众所周知”的C书(用我的语言),我从来没有学到任何东西。K&R 在 20 页中写了 3 章的方式简直令人惊叹,当然我不能指望巨大的解释,但这也引发了问题。

我对这一点有疑问 1.5.1 这本书说(第 16 页):

[...] char 类型专门用于存储此类字符数据,但可以使用任何整数类型。我们使用 int 是出于一个微妙但重要的原因。问题在于将输入的结尾与有效数据区分开来。解决方案是 getchar 在没有更多输入时返回一个独特的值,该值不能与任何真实字符相结合。此值称为 EOF,表示“文件结束”。我们必须声明 c 是一个足够大的类型来保存 getchar 返回的任何值。我们不能使用 char,因为除了任何可能的 char 之外,c 必须足够大以容纳 EOF。因此我们使用 int.[...]

在谷歌搜索另一种解释后:

EOF 是一个表示文件结束的特殊宏(Linux:使用键盘上的 CTRL+d 来创建它,Windows 命令:使用 CTRL+z(可能必须在新行的开头,后跟 RETURN)):通常 EOF = -1,但依赖于实现。必须是对于任何可能的字符都不是有效值的值。出于这个原因, c 是 int 类型(不是人们可能期望的 char )。

所以我将源代码从 int 修改为 char 以查看有什么问题,关于取 EOF 值......但没有问题。以同样的方式工作。

我也没有破坏 getchar 如何获取我写的每个字符并打印所有内容。Int 类型是 4 字节长,因此它可以在一个变量中占用 4 个字符。但我可以输入任意数量的字符,它会以相同的方式读取和写入所有内容。而对于 char,也会发生同样的情况……真正发生了什么?超过 1-4 个字符时,值存储在哪里?

0 投票
3 回答
507 浏览

c - C 编程 - K&R 示例 1.5.2 - 修改后的程序未按预期运行

我的问题只是“为什么我在第 10 行和第 11 行的代码不能正常运行?” 我的代码的预期目的是完全按照原始 K&R 代码的意图执行,但不计算 nc 任何时候 (getchar() == '\n') 请您赐教?

稍作修改的 K&R 代码:

我使用 64 位 Windows 7、CodeBlocks10.05、GNU GCC 编译器。

我目前的进展和理解:

在示例运行中,我输入单词two并按 Enter,这等于 4 个输入,然后按 ctrl+Z 输入一个^Z或 EOF 字符。然后程序打印1. 我期待它打印3。我想唯一合乎逻辑的解释是它的行为与我的意图完全相反(它只计算换行符?)。事实证明,如果我输入单词two并按回车键,让我们说 4 次,它会打印4. 它似乎在计算nc输入的每个换行符,但是如果我单独按 Enter(在这种情况下为 4 次)然后按 EOF,它总是会打印0. 经过进一步的实验,在某些人看来,看不见的 4 可能是这个程序的一个神奇数字。如果我启动它并准确地按回车键(一个可被 4 整除的数字)然后 EOF 它会打印0. 但是,如果我按其他次数输入,EOF 什么都不做,我必须输入^Z两行,一个接一个,才能正确结束 while 循环,然后打印1。这让我大吃一惊!

0 投票
4 回答
7299 浏览

c++ - 函数内部的“外部”?

好吧,阅读“有点老”的书(Dennis Ritchie 的“The C programming language”,第二版),我遇到了以下问题:

外部变量必须在任何函数之外只定义一次;这为其预留了存储空间。该变量还必须在每个想要访问它的函数中声明

我当时想 -什么?!

“还必须在要访问它的每个函数中声明该变量”。然后,我又震惊了一次:

还有一个——什么?!


据我所知(显然,这还远远不够),extern只有当您在某处定义一个全局变量并且您想通过另一个文件访问它(而不是再次定义它)时才有意义。

所以:

  • this或任何其他函数extern int max 内部的意义何在?main
  • 标准是否真的说,这是必须的(对于这个例子,我需要在每个函数中声明这个最大值,它将使用它?)
  • 这对于 C++ 是否相同(这就是我放置 C++ 标签的原因)?这是我第一次看到这样的事情。

注意:这与在函数内部将静态变量声明为 extern 有什么用处不同?

0 投票
3 回答
6247 浏览

c - 二叉树元素的递归printf

我回到 K&R 是为了阅读一章,并注意到我之前省略的一个示例。本章涵盖了二叉树数据类型的主题。我了解在节点中存储新条目,但打印功能让我感到困惑。为什么要先打印左侧部分?

如果它printf是函数中的第一个命令,然后是左和右,它会起作用吗?

如果不是——那为什么?

0 投票
6 回答
1020 浏览

c - 关于 Kernighan 和 Ritchie 练习的问题 2-3

我正在尝试用 C 语言编写一个将十六进制数转换为整数的程序。我已经成功编写了一个将八进制转换为整数的程序。但是,一旦我开始使用字母 (af),问题就开始了。我对该程序的想法是广告如下:

  1. 参数必须是一个以 0x 或 0X 开头的字符串。

  2. 参数十六进制数存储在 char 字符串 s[] 中。

  3. 整数 n 被初始化为 0,然后按照规则进行转换。

我的代码如下(我只阅读了 K & R 的 p37,所以对指针不太了解):

我的问题是:

1. 如果我在 htoi(s) 的参数中不使用 const,我会从 g++ 编译器收到以下警告:

2-3.c:在函数“int main()”中:2-3.c:93:20:警告:不推荐将字符串常量转换为“char*”[-Wwrite-strings] 2-3.c:97 :22: 警告:不推荐从字符串常量转换为 'char*' [-Wwrite-strings] 2-3.c:101:21:警告:不推荐从字符串常量转换为 'char*' [-Wwrite-strings] 2 -3.c:105:21:警告:不推荐将字符串常量转换为 'char*' [-Wwrite-strings]

为什么是这样?

2.为什么我的程序需要这么长时间才能运行?我还没有看到结果。

3.为什么我在终端输入 cc 2-3.c 而不是 g++ 2-3.c 时,会出现以下错误信息:

“未定义对‘pow’的引用”

在我使用过电源功能的每一行上?

4. 请指出我的程序中的其他错误/潜在改进。

0 投票
1 回答
81 浏览

c - 用不同于函数本身使用的命名参数声明函数的目的是什么?

也许这只是为了展示。在阅读 K&R 时,1.7 Functions的开头显示了幂函数的示例。第二行代码声明int power(int m, int n);

为什么函数源中n第一个参数 的命名与第一个参数的命名不同base

这仅仅是为了表明名称不需要相同吗?应该避免这种做法吗?为什么或者为什么不?

0 投票
1 回答
147 浏览

c - 由于 EOF 字符,什么情况导致该程序提前离开 for 循环?

继续查看这篇文章的底部以了解实际问题

我可能试图过多地理解真正简单的事情,但在我弄清楚这一点之前我无法继续。

在阅读 K&R 1.9 字符数组时,您遇到了一个示例程序,该程序接受输入并确定哪一行最长,然后重新打印它。

为了理解这个程序的getline函数,我稍微修改了一下,在它的运行过程中打印了一些信息。现在我发现了一些输入,一旦我理解了这些输入,应该会大大增强我对 getchar() 的理解。


附带说明一下,当我尝试从库中读取源代码时,我完全不知所措。例如,我尝试寻找 getchar() 并最终目瞪口呆地盯着#endifstddef.h 的第 300 行某处的 18 座塔。我将通过在不久的将来停止对 stdio.h 中的功能的追求来避免这种头痛。图书馆很难找到东西是正常的吗?该函数不应该作为可读源存在,还是我只是抱有希望?


为方便起见,我将继续从 K&R 发布整个修改后的程序:


这是一些示例输入/输出:我正在使用 CodeBlocks 和 Windows 7

sampleIO

Finally, my question is why does the for loop in the getline() function leave the loop after it gets to F and therefore places the null terminator after F as \0

My hypothesis is that perhaps putting the EOF character shown as ^Z in the windows terminal, the array is truncated to a length of 4 characters plus a null terminator. It turns out if I put the EOF character inside a line to be read, the saved line s[] will only contain a maximum size of 5. What also confuses me is that the variable len will always be 0, is that because len is assigned during the while loop in main(), and does not have its value saved once that while loop is broken?

Something interesting to me, but probably not to experienced C users, is that the if statement right after the for loop in getline() can either be inside the for loop, or outside and it does not change the program. Interesting, because won't that mean that whether or not the for loop executes any code in the body, at the very least (c=getchar()) is executed?

Sorry the question is so wordy, I appreciate any helpful comments/answers.