问题标签 [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 - text-wrapping program in c does not work correctly
I'm following K & R. At the end of chapter 1, one of the proposed exercises is about writing a text wrapping program. Here's the code I wrote:
I wrote a file called wraptest which includes the following:
when running
I get the following
Valgrind gives me the following:
So what's the error? I've been searching for about an hour but I haven't found it.
c - K&R 中的“文件复制”部分
我是编程新手,我似乎无法理解为什么我的代码中会发生以下情况,即:
所以在做了一些阅读之后,我收集了以下内容:
- 在我按下 Enter 之前,什么都不会执行,因为
getchar()
它是一个保持功能。 - 在我按下 Enter 之前,我所有的击键都存储在缓冲区中
- 当
getchar()
被调用时,它只是查看缓冲区中的第一个值,成为该值,然后从缓冲区中删除该值。
我的问题是,当我删除第一个c = getchar()
生成的代码时,它的功能与原始代码完全相同,尽管在我输入任何内容之前,屏幕上会立即出现一个笑脸符号。为什么会这样?是不是因为putchar(c)
没有保留代码,而是尝试显示c
尚未定义的 ,因此它输出了一些随机符号?如果有帮助,我正在使用 Code::Blocks。
c - K&R 1.21,打印数组时插入新行
我正在通过 K&R 工作,我对我的程序的输出有点迷惑,当按下制表符而不是将制表符插入 char 数组行时,使用 if 语句插入 8 个空白字符;但是,当我按回车键而不是获得所需的输出时,我的单词由换行符而不是空格或空格分隔。好奇的问题 1.21
输出示例
据我所知,我的代码负责换行符,不仅换行符直到输入的最后一个'm'之后才会出现。在我看来,当按下制表符时,会在行中插入一个 '\n' 字符,但我的代码添加了 8 个空格。
c - c segfault 直接来自教科书
我最近学习了 The C Programming Language(第 2 版),并且一直在研究书中的示例。数组给我带来了问题。具体来说,它似乎与类型转换有关。1.6 节的示例读取输入,然后计算有多少字符属于某些类别。当我通过可执行文件传输源代码时,除了没有正确捕获任何数字字符之外,这段代码似乎正在创建段错误。如果我使用标准输入和 ^D 到 EOF,那么它根本不会捕获数字,而是将它们计为其他字符(尽管没有段错误)。
我已经通过交换其他部分消除了它是程序的不同部分导致故障的可能性,但如果有帮助,我仍然可以发布其余部分。据我了解,这个循环应该通过输入中的单个字符。如果它们的值介于 0 和 9 之间,则它将字符转换为数字(对应于 ndigit 数组位置 0-9)并将该数组位置增加 1。
K&R 2e 真的过时了吗?字符编码(ASCII vs Unicode)是字符数转换为整数的问题吗?任何意见,将不胜感激。
我不确定如何检查我的编码(如果它甚至很重要),但我的编译器是 gcc (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3
c - 在目录上使用 `read` 系统调用
我正在查看K&R 2中的一个示例(8.6 示例 - 列出目录)。ls
它是 Linux 命令或 Windows的精简版dir
。该示例显示了诸如opendir
、之类的函数的实现readdir
。我已经尝试逐字输入代码,但它仍然不起作用。它所做的只是打印一个点(对于当前目录)并退出。
我在代码中(在 的实现中readdir
)发现的一件有趣的事情是它正在调用系统调用,比如目录上的open
和read
。就像是 -
当我运行此代码时,即使文件夹名称"dirname"
中有一些文件,我也没有得到任何输出。
此外,这本书说,该实现适用于版本 7 和 System V UNIX 系统。这就是它不能在 Linux 上运行的原因吗?
这是代码 - http://ideone.com/tw8ouX。
那么Linux不允许read
对目录进行系统调用吗?还是其他原因造成的?
c - <= 的使用会挂起程序,但 < 工作正常(K&R C 练习 1-20)
我正在尝试解决 K&R C 的问题(练习 1-20)。我已将原始 getline
功能转换为int detab(char s[], int lim, int tab)
. 以下部分功能出现问题:
如果我按照上面写的方式运行它 - 程序只是挂起并且什么都不做。如果我更改if (i < ttab)
程序的if (i <= ttab)
行为符合我的预期(i
比需要的高 1)。如果我取消注释--i; //SPIKE
并--i; //SPIKE
注释掉:
然后,我对程序行为感到满意,但对代码外观不满意。
我的意图是摆脱:--i; //SPIKE
并将--i; //SPIKE
其替换为:
但是为什么会导致挂起以及如何解决呢?
c - C 数组计数(初级)
我目前正在阅读 Kernighan & Richie 的“The C Programming Language”,我正在努力弄清楚一行的作用。我想我只是有点愚蠢,并不太理解他们的解释。
我不得不稍微改变程序,就像ndigit
以前给我垃圾值一样,所以我只是将数组实例化为 0,而不是用 for 循环遍历它,并以这种方式更改值。
使用程序作为输入,我们将其打印到控制台 -
我知道这7 2 0 0 0 0 0 0 0 1
是单个数字出现在输入中的次数 0 出现 7 次,1 出现两次等)
但是,...[c-'0'];
“工作”如何?
c - K&R 2-3 htoi 分段错误
嗨,这是我在这里的第一个问题,所以如果我没有遵守所有发帖规则,我深表歉意。这是 K&R 练习 2-3,我在使用 GCC 编译时遇到了分段错误,而且我不熟悉调试器以了解发生了什么。如果有人可以浏览代码并帮助我解决问题,我将不胜感激。
c - 如何用 C 编写 C 编译器?
这个问题可能源于我对编译器的误解,但这里......
您可以在 K&R 第一版(第 xi 页)的前言中找到以下声明:
操作系统、C 编译器和基本上所有的 UNIX 应用程序(包括用于编写本书的所有软件)都是用 C 编写的。
(我的重点)
这是我不明白的:在编译任何 C 代码之前,C 编译器是否必须自己编译?如果那个 C 编译器是用 C 编写的,那么编译它不需要已经存在的 C 编译器吗?!
解决这个无限回归难题(或先有鸡还是先有蛋的问题)的唯一方法是,K&R 所指的用 C 语言编写的 C 编译器实际上是用已经存在的 C 编译器编译的,该编译器是用非 C 语言编写的. 用 C 编写的 C 编译器随后取代了后者。
还是我完全关闭了?
c - 写入数组外的位置
我刚开始学习编程。这是我的第一篇文章。我正在阅读 Kernighan 和 Ritchie 的《C 编程语言》一书,遇到了一个我不理解的示例(第 1.9 节,第 30 页)。
该程序将文本作为输入,确定最长的行并打印出来。声明了字符数组 line[MAXLINE],其中 MAXLINE 为 1000。这应该意味着该数组的最后一个元素的索引为 MAXLINE-1,即 999。但是,如果您查看函数 getline,它正在传递 line[ ] 数组作为参数(MAXLINE 作为 lim),看起来如果用户输入的行长于 MAXLINE,则 i 将递增直到 i = lim,即 i = MAXLINE。因此,语句 line[i] = '\0' 将是 line[MAXLINE] = '\0'。
这在我看来是错误的 - 如果 line[] 的大小是 MAXLINE,我们如何写入 line[MAXLINE] 位置。它不会写入数组之外的位置吗?
我能想到的唯一解释是,在声明 char array[size] 时,C 语言实际上创建了 char array[size+1] 数组,其中最后一个元素是为 NULL 字符保留的。如果是这样,这很令人困惑,并且在书中没有提到。谁能证实这一点,或解释发生了什么?