问题标签 [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.
c - 来自 Kernighan/Ritchie 的第 5.10 节命令行参数/可选参数
第一次海报。希望有人可以帮助我解决这个问题。在 5.10 节中,Kernighan 给出了一个程序示例,该程序重新打印带有字符串的文本行。所以我在我的文件夹中将它保存为“find”,然后进入 cmd,然后进入文件夹,然后键入 find“-x 不管”。然而由于某种原因,'-' 没有注册,它只是将“-x 不管”视为一个长字符串。有人知道为什么会这样吗?谢谢。
c - K&R malloc 代码没有意义?
此代码来自 K&R 书 - 第 8 章第 7 节:示例 - 存储分配器。至少对我来说,这段代码没有意义。“Header”是一个结构体和一个“最严格的对齐类型”的联合,它是一个长类型。然后,Malloc 将找到一个足够大的可用空间,其大小是标头大小的倍数。
这段代码的奇怪部分是语句nunits = (nbytes+sizeof(Header)-1)/sizeof(Header) + 1;
,然后在比较中使用它if (p->s.size >= nunits)
来找到一个足够大的空间,其中包含以 Header 大小为单位的单位。不应该nunits = (nbytes+sizeof(Header)) / sizeof(Header)
只有前者吗?原始代码将评估为小于应有的值。+-1 是怎么回事?为什么分配的空间少于预期。
c++ - K&R风格的函数定义使用g++编译
编译使用旧式函数定义的 ac 文件时,例如
g++ 将给出错误:'a' 未在此范围内声明。gcc 可以解析这个。有没有办法让 g++ 认识到这一点?
这对我来说是一个问题,因为我正在编译 c 和 c++ 文件的混合。一个相关的问题是构建这种混合源的标准做法是什么?在所有文件上运行 g++ 还是仅在 cc 文件上运行?前者很方便,但由于 c 和 c++ 规范之间的不一致(例如,char[4]="four";)而给我带来了一些麻烦
c - k&r 中的 getint 模糊定义,其中 ungetch 的奇怪行为
我在理解以下代码中的几行时遇到了一个大问题(注释中标记的数字):
首先 - 用输入数据填充数组的循环代码:
现在函数定义:
所以:
[1] 我在这里读过类似的帖子,取回这样一个不需要的字符会以某种方式阻塞缓冲区,因此我们需要使用另一个函数来清除它。对我来说,奇怪的是没有包含在 K&R 中,作者甚至没有提到使用它的必要性?
[2] 为什么我们返回 0?这会停止整个 main() 程序吗?还是只是将 0 放入数组中?( getint(&array[n]) ?
[3] 为什么我们需要实现这样一个公式来计算“大数”?由于该函数只是一个接一个地获取数字(getchar 不是 getword),然后通过几个单个整数创建“大数字”。
[4a][4b] 如果 c != EOF,为什么它会取消提取?这个条件大部分时间都满足了,所以我们最终会拒绝每个输入的数字吗?
提前感谢您的回答!
c - 不确定来自 K&R 的句子的正确性 - 指针算法 | 释放程序
引述:
测试 if (allocbuf + ALLOCSIZE - allocp >= n) { 检查是否有足够的空间来满足对 n 个字符的请求。如果有,allocp 的新值最多会超出 allocbuf 的末尾。
它涉及的代码:
那么怎么能超出allocbuf中的最后一个位置呢?在我看来是 allocbuf[9999]
除此之外的任何东西,例如。allocbuf[10000] 不正确,是内存泄漏,对吗?
问题的第二部分 - 我虽然根据其名称的自由函数正在删除保存在数组中特定位置的值。但是,正如我所见,它只是将“记录头”移动到数组左侧的几个位置?保存在那里的数据保持不变。
c - K&R 中边界有限的qsort | 排序过程不会在字符串中的下一个位置继续
很抱歉又一个关于 K&R 计划的问题打扰您。但是有些事情我也不清楚。下面的程序用于对 readlines 函数保存的行进行排序(它真的保存了它们吗?)为此,我们创建了一个指向这些行中的每一行的指针数组。
问题:[1] 为什么我们通过qsort(lineptr, 0, nlines-1);
我的意思是 nlines-1 而不仅仅是 nlines ?
[2] 假设我输入了两行:
好极了
阿尔法
现在它们是从数组中指向的(我将进行可视化,所以不要因为看到括号中的字符而生气;))
*v[] == [lineptr[0] - 指向 bravo 的指针][lineptr[1] - 指向 alfa 的指针]
根据算法: lineptr[0] 是枢轴,所以我们交换它们;最后 = 0; 进入 for 循环:strcmp of - lineptr[1] 在词法上不小于 lineptr[0];递增 i 已经完成,所以我们退出 for 循环。现在我们将 last = 0 与 left = 0 交换,所以什么也没有发生。它们已经就位。
但是,如果它们以相同的字母开头,例如。abravo 和 alfa,如果 qsort 仅在数组的索引上从左到右操作意味着不同的行数而不是检查字符串中的下一个字符,它将如何继续下一个字母。
请纠正我,因为所有这些指针都让我发疯。
整个代码:
提前感谢您的帮助
c - gettoken 函数 - 不明确的程序 (K&R)
我有几个问题,所以我会在评论中输入数字,以便更容易找到有问题的行。
[1] 如何将 char *p 分配给实际上不存在的令牌变量?
[2] 为什么我们不在这里放 '\0',在其他 if 条件下做了什么?
[3] 为什么我们只将 () 复制到令牌字符串中?在 [] 和字母数字字符的情况下我们不这样做吗?
[4] 这些返回命令很奇怪 IMO -> 首先:为什么它看起来不像返回 PARENS,其次:当它返回 tokentype = '(' 它是一个字符时,为什么函数 gettoken 被声明为返回整数?
[5] SUPPOSING part: let input be (abc) then: ( 导致函数返回 tokentype '(' abc enter if condition (isalpha(C)) and the last ) 退出导致 ungetch 的条件。它是否遵循主要的 else 条件那么我的演练正确吗?
提前致谢!
c - va_list过程中的for循环,继续漫无目的地使用(?)K&R
下午好!我对以下代码有一些疑问。
[1] for循环中的中间条件是什么意思?; *p;
和; *sval;
- 到达输入字符串的结尾?如果是,如何确定?
[2] 我不明白那个复杂的 for 循环。
假设如果条件不满足*p == %
,那么我们立即进入 switch。现在让我们考虑相反的情况,尽管 ,我们输入每个其他字符%
,如果满足,那么我们使用 continue 并在switch
之后继续。那这两种情况有什么区别呢?我一定是大错特错了,但我现在2个多小时都找不到我的错误……
非常感谢您的帮助!
c - linux下使用read()混淆getchar
为什么我们写 *bufp = buf 因为两者都是数组所以在我看来它应该是:
/li>*bufp 如何“知道”从哪个位置开始显示?它不会以任何方式初始化为零。分配
buf
给后,bufp
我希望在返回行中它以最后输入的字符开头。此处使用 unsigned char 修饰符是否只是为了省略作为输入的情况-在大多数系统上
-1
意味着?EOF