Tag: kernighan and ritchie

这个小C程序是否满足K&R练习?

我正在参加K&R的练习1-18 编写程序以从每行输入中删除尾随空白和制表符,并删除完全空行。 这是我到目前为止所提出的 #include #define MAXLINE 1000 int getline(char line[], int maxline); void copy(char to[], char from[]); int main () { int len; char line[MAXLINE]; while (getline(line, MAXLINE) > 0) { printf(“%s”, line); } return 0; } int getline(char s[], int lim) { int c, i, lastNonBlankIndex; lastNonBlankIndex = 0; for (i=0; i < lim […]

K&R练习:我的代码有效,但感觉很臭; 建议清理?

我正在研究K&R的书。 我读得比我做的更进一步,主要是因为时间不够。 我正赶上来,并完成了第1章的几乎所有练习,这是教程。 我的问题是练习1-18。 练习是: 编写程序以从输入行中删除尾随空白和制表符,并删除完全空行 我的代码(下面)做到了,并且有效。 我的问题是我实施的修剪方法。 感觉……错……不知何故。 就像我在代码审查中看到C#中的类似代码一样,我可能会疯了。 (C#是我的专长之一。) 任何人都可以提供一些关于清理它的建议 – 所述建议必须只使用K&R第1章的知识。(我知道有很多方法可以使用完整的C库来清理它;我们’我只是在这里谈论第1章和基本的stdio.h。)另外,在给出建议的时候,你能解释它为什么会有用吗? (毕竟,我是在努力学习!谁能比这里的专家更好地学习?) #include #define MAXLINE 1000 int getline(char line[], int max); void trim(char line[], char ret[]); int main() { char line[MAXLINE]; char out[MAXLINE]; int length; while ((length = getline(line, MAXLINE)) > 0) { trim(line, out); printf(“%s”, out); } return 0; } int […]

在函数调用中,运算符是什么,操作数是什么?

我试图理解C语言的一些基础知识.CRC编程语言说 函数调用是一个后缀表达式 ,称为函数指示符,后跟括号,其中包含一个可能为空的逗号分隔的赋值表达式列表(Par.A7.17),它们构成函数的参数。 在函数调用中,运算符是什么,操作数是什么? 是()运营商? 函数名是操作数吗? 是()操作数内的参数? 函数指示符是函数调用的同义词吗? 谢谢。

ungetc(或从K&R取消工作)的目的是什么?

任何人都可以向我解释ungetch的目的吗? 这是来自K&R第4章,您可以在其中创建反向波兰计算器。 我没有调用ungetch就运行了程序,在我的测试中它仍然可以正常工作。 int getch(void) /* get a (possibly pushed back) character */ { if (bufp > 0) { return buf[–bufp]; } else { return getchar(); } } void ungetch(int c) /* push character back on input */ { if (bufp >= BUFSIZE) { printf(“ungetch: too many characters\n”); } else { buf[bufp++] = c; } […]

K&R练习1-20 – 需要一些澄清

我不完全理解以下练习的内容: “编写一个程序详细信息,用空格中适当数量的空格替换输入中的选项卡到下一个制表位。假设一组固定的制表位,比如每n列。应该是变量还是符号参数?” 有人可以澄清粗体部分吗?

char * argv 是什么意思?

我是C编程的新手,我遇到了一个问题。 如果复杂的声明,我发现了这一点 int *daytab[13]; // daytab is an array of 13 pointers to int 这意味着daytab是数组的名称,数组的名称指向数组的第一个元素。 数组名称与daytab++等指针操作不兼容(如果我错了,请纠正我)。 但我发现这段代码是用Dennis Ritchie编写的 main(int argc, char * argv[]) { while( –argc > 0 ) printf(“%s%s”,*++argv,(argc>1) > ” ” : “”); printf(“\n”); return 0; } 他们如何操纵argv ? 它不是数组名称吗?

我正在努力了解K&R的练习1-21

这是我想要了解的问题: 编写一个程序’entab’,用最少数量的制表符和空格替换空白字符串,以达到相同的间距。 如果一个标签或一个空白就足以达到一个制表位,应该优先考虑? 解码问题: a 。 这是一个在输入中注入“标签”的程序。 b 。 如果字符串由连续的空格组成,则必须使用最少数量的制表符和空格替换这些空格。 该程序应如何在以下输入中表现: 嘿***** ******喜 哎嗨! 喜####哎! 你好你好吗? 喜#**哎! 决定最小标签数量以及最小标签和空格组合的标准应该是什么? 标签为’#’,空格为’*’,TABSTOP = 8。 该陈述的含义是什么:“当标签或单个空白足以达到制表位时。” 注意:我已经完成了这个重复问题的答案,但我发现它们没有帮助。

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

好吧,我几个月前读过另一本“知名”的C书(用我的语言),我从来没有学到这一点。 K&R在20页中写出3章的方式简直令人惊叹,当然我不能指望大量的解释,但这也会引发问题。 我对这一点有疑问1.5.1这本书说(第16页): main(){ int c;// <– Here is the question c=getchar(); while (c != EOF){ putchar(c); c = getchar(); } } […] 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类型长度为4bytes,因此变量中可以包含4个字符。 但我可以放任意数量的字符,它会以相同的方式读写所有内容。 和char一样,发生了同样的事情……真的发生了什么? 当超过1-4个字符时,值存储在哪里?

这条线的目的是什么? (function声明)

我正在通过K&R学习编程。 到目前为止还不错,但我不清楚第1.8节(函数)中的一行代码的作用。 在1.8节中,作者向您展示了如何创建一个函数来将一个整数提升到另一个整数的幂。 我已经粘贴了下面的代码,正如书中所写的那样。 一切都很好。 但我不知道为什么他们把这条线包括在最上面: int power(int m, int n); 这本书没有提到它,除了说该程序将整数m提高到幂n。 如果我从代码中删除该行,程序仍然按预期输出。 如果我理解这一点,就行了 int power(int base, int n) 创建函数,下面的大括号定义函数。 然后main下的大括号调用函数输出图表。 所以这一切似乎都有道理。 但我不明白最重要的是什么。 这可能是无关紧要的,但我似乎更有可能错过了一些东西。 任何人都可以告诉我为什么那条线在那里? #include int power(int m, int n); /* test power function */ main() { int i; for (i = 0; i = 0 */ int power(int base, int n) { int […]

EOF练习1-6 K&R C编程语言

这可以直接从K&R书中获取: !=的优先级高于= ,这意味着在没有括号的情况下,关系测试!=将在赋值=之前完成。 所以声明 c = getchar() != EOF 相当于 c = (getchar() != EOF) 这具有将c设置为0或1的不期望的效果,这取决于getchar的调用是否返回文件末尾。 (更多相关内容见第2章。) 练习1-6。 validation表达式getchar() != EOF是0还是1。 我无法理解如何进行此练习以及了解块引用段落的内容。 我知道EOF是int类型的符号常量,通常保持值-1。 由于负值int在进行比较时永远不能保持与char相同的值,因此需要将其提升为int,然后以某种方式表示文件的结尾。 我也没有上面指定的括号进行比较!=在分配之前完成但是这实际意味着什么? 这个function发生了什么? 我还打印了EOF的值,它是-1,当它说validation它是0还是1时,练习是什么意思?