问题标签 [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 - 为什么这个程序不报错?
可能重复:
int c = getchar()?
我没有使用 C 的经验,但我知道 C++。我想问这里的“c”被声明为整数类型,但令人惊讶的是,当我运行这个程序时,它甚至接受字符。谁能解释一下。
参考:C 编程 Ritchie/kernighan
c - getword 中的分段错误
嗨,这是关于 Kernighan 和 Ritchie 关键字计数程序的问题(ANSI 版的第 6 章第 3 节)。我在下面的链接中包含了整个代码。
当我尝试在任何 C 源代码上运行代码时,我没有得到任何输出。因此,为了查明问题,我在代码的不同点打印了语句。终端窗口中程序的输出(应用到自身时)现在看起来像这样:
当我使用另一种搜索方法(通过结构键数组进行线性搜索)时,我得到了相同输出的另一种组合,这次没有分段错误。根据 printf 语句的输出,我倾向于认为 getword 函数有问题。那么是什么导致了这些错误呢?
以下是具有二进制和线性搜索功能的完整代码:
c - 缺少 main() 会阻止在链接时创建可执行文件
我在 Windows 上使用 Microsoft Visual C++。我编译得很好,没有任何错误。但是,当我尝试执行它时,出现了两个错误。我阅读了调试错误,但我无法理解它们。我在 C 编程方面有点新手。
此代码来自 Kernighan 和 Ritchie 的教科书第 61 页:
错误:
c - 从 Kernighan 和 Ritchie 中删除评论程序
这是关于 Kernighan 和 Ritchie 中的评论删除程序(编号 1-23 p 34 ANSI eidtion)。以下是我的解决方案。
该程序适用于大多数 C 程序,删除注释。但是,在某些注释以多个星号 ( ** /) 结尾的程序中,它会带来问题(不通读)。一个这样的例子是这个:
然而,它适用于这个程序,尽管它在开头有类似的评论:
那么你认为是什么导致评论删除程序出现这种行为呢?
c - strcmp:行内的字段
我正在编写一个 strcmp 版本,它可以选择仅根据空格和字母数字字符(目录顺序)比较字符串,也可以选择不区分大小写(Kernighan 和 Ritchie 第 121 页 5-16)。所以我想出了以下内容:
这很好用并回答了问题,但是当我开始使用 char 指针而不是数组时问题就开始了。当我初始化 char* a 和 char* b,而不是数组 a 和 b,并在第 11 和 12 行将 a[i++] 替换为 *a++ 并在第 15 和 16 行将 b[j++] 替换为 *b++ 时,我得到分段错误。当 a+i 是 a[i] 的地址时,为什么会出现此错误?
c - 无法在交叉引用中增加行数
我正在尝试编写一个交叉引用器,它打印一个单词列表和它们出现的行号,忽略诸如 a、an、the 等“噪音”单词。(Kernighan 和 Ritchie,ANSI 版 p 143 问题6-3)。以下是代码:
这是我使用的 getword 函数:
以下是用于搜索 char 指针的 binsearch:
如果 getword 遇到非字母(单词的第一个字符)或非数字字符,它应该返回它。因此,我将 lincecount 设置为在 getword 返回“\n”时递增。但这似乎不会发生。
c - 为什么 \b 不被 ex 识别。1-10 在 K&R?
为什么按退格键时看不到 \b 退格签名?
c - K 和 R 练习 1-24
我正在用 Kernighan 和 Ritchie 编写的 C 编程语言编写程序。
我目前正在练习 1-24,它说:
编写一个程序来检查 C 程序中的基本语法错误,例如不平衡的括号、方括号和大括号。不要忘记引号,单引号和双引号,
escape sequences
以及注释。
我做得很好......但我不知道escape sequences
这些括号,括号和大括号会如何影响?
为什么他们警告转义序列?
c - K&R 练习 1.16 - 行长限制
我正在从 K&R 的“ The C Programming Language ”一书中学习 C。我正在做书中指定的练习。我在练习 1.16,但我不明白。
练习 1.16:
修改最长行程序的主程序,使其正确打印任意长输入行的长度,并尽可能多地打印文本。
我的问题:
“......尽可能多的文本......” - 字符串长度是否有一些限制?也许在标准标题中有一个具有最大允许字符串长度值的变量?
“......任意长输入行的长度......” - 但在代码中 MAXLINE 定义为 1000。它的大小也有限。我在这里看到了一些解决方案,但在我看来,这不是解决方案决定,因为前者对行的长度有限制(1000 个字符)。
也许我不明白这个任务。我的理解是我必须取消 1000 个字符的限制。
c - 在 K&R 1.9 最长线示例中,getchar() 是做什么的?
我现在似乎理解了这个程序,除了这个getline
函数不是很直观,因为它似乎将所有内容复制getchar()
到一个字符数组s[]
中,而这个字符数组从未真正用于任何重要的事情。
该函数可以很容易地忽略该行s[i] = c;
,因为该函数实际上所做的只是计算字符数,直到它到达EOF
或'\n'
返回getchar()
我真正不明白的是为什么程序向前推进,因为主循环如下:
唯一的解释是,getchar()
在用户输入整行文本并enter按下键后,该功能会发挥作用。所以它似乎在运行时工作是我的猜测。
这是程序的进展方式吗?程序是不是先进入while循环,然后等待用户输入一行文本,一旦用户敲回车,getline
就迭代函数的for循环?我觉得情况就是这样,因为用户可以在输入backspace期间输入。
我的问题是,该计划到底是如何推进的?都是因为getchar()
功能吗?
当我在终端中点击ctrl-D时,会发生其他一些令人困惑的事情。如果我在换行符的开头点击ctrl- ,程序将终止。D如果我在填充了一些文本的行的末尾点击ctrl- D,它不会终止,并且它的行为方式与点击enter. 如果我在一行文本中点击ctrl-D几次,程序最终将结束。
这只是我的终端处理会话的方式,还是如果我只想学习 C 语言,这些都是我不应该担心的?
我问的原因是我喜欢跟踪程序以更好地理解它,但是getchar()
函数使这很棘手。