不可能的K&R练习。
“写一个程序entab,用最少的制表符和空格来替换空格字符串,以达到相同的间距。使用相同的制表位,比如每n列。n应该是一个变量还是一个符号参数?”
我遇到的问题是,我不确定如何正确地做到这一点。我知道这不是很好的解释,但这几乎是这里的问题。我见过的大多数例子都计算了一些空白,并将这些系列替换为制表符,但这不是它所要求的,我想我理解它的要求,但目前感觉无法做到这一点。
有人可以帮忙吗:)
编辑:到目前为止我写的代码是can be found here。
不可能的K&R练习。
“写一个程序entab,用最少的制表符和空格来替换空格字符串,以达到相同的间距。使用相同的制表位,比如每n列。n应该是一个变量还是一个符号参数?”
我遇到的问题是,我不确定如何正确地做到这一点。我知道这不是很好的解释,但这几乎是这里的问题。我见过的大多数例子都计算了一些空白,并将这些系列替换为制表符,但这不是它所要求的,我想我理解它的要求,但目前感觉无法做到这一点。
有人可以帮忙吗:)
编辑:到目前为止我写的代码是can be found here。
9条答案
按热度按时间6jjcrrmo1#
如果你的问题是“这是要求我做什么?”我想我可以通过解释原始问题(以不同的方式提出相同的问题)来提供帮助。
写一个程序,输入带有空格的文本,输出尽可能使用制表符的视觉等效文本。
例如,制表符每隔8个字符,空格显示为“.”,制表符显示为“-”;
字符串
编写程序,使tabstop参数n可以变化,即允许n的值不为8。准备好证明你的决定,使n为常数,或者变量。
最后一个提示是,状态机可以使这种算法更容易编写、验证、测试和读取。
型
b5buobof2#
我有点晚了,但这是我自己解决这个问题的方法。这是一个不同于上面分享的方法,所以如果你有任何意见/反馈,请分享。
查看my public gist on Github的源代码,这里有代码注解,文件顶部解释了方法,但我将复制并粘贴到这里,以便从一开始就清楚逻辑。
方法:
最后,我们打印出读入的字符(不是制表符/空格)
以及更新空间计数和字符计数(如有必要)。
我仍然是一个新手程序员在所有意义上,所以我不知道如何将比较与其他解决方案张贴在这里,但逻辑似乎更容易遵循(至少对我来说)。
希望这对以后的人有所帮助!
sg3maiej3#
我同意你的评估。用制表符替换每n个空格是不够的;例如,如果n == 4,“hi blank blank blank”不应该被替换为“hi tab”,而是“hi tab blank blank”。
听起来你需要做的是在阅读每一行时跟踪当前位置,并使用这些信息来确定你需要多少个标签。这有帮助吗?如果你需要更多细节,请告诉我!
至于“变量与符号参数”部分,两者都是可行的,但我能想到使用变量的一个显著优点:你可以在不重新编译的情况下为不同的n值运行程序。
bjp0bcyl4#
让我提供另一个至少处理提供顶级答案的情况。它只处理一个字符串。
假设列表是至少包含2个空格的事物。
1.让我们跟踪尾随空格的数量。
1.如果最后一个符号和当前符号都是空格,则可能有一个表格。
1.当尾随空格的数量等于制表停止时:将主计数器设置为counter -tablation stop - 1(就像我们使用数组一样),然后将位置分配给
\t
1.将计数器变量移位后,其他符号将照常写入
字符串
olhwl3o25#
我的理解是,你不必真的知道问题是什么或者如何解决它来回答这个问题。这个问题似乎是在问你是否理解何时使用变量而不是“符号参数”。我实际上不确定“符号参数”是什么意思;它似乎是过时的术语。
话虽如此,解决问题的第一部分(用制表符代替空格)是相当直接的。
tuwxkamq6#
我粗略地看了一下你的代码,没有什么明显的错误。
因此,我的建议是,要么在调试器中单步调试几个输入示例,一边调试一边检查变量值,要么添加一大堆调试打印语句。无论哪种情况,您的目标都是找到程序状态开始偏离预期或意图的点。
m3eecexj7#
我正在浏览KnR,看到了这个页面:
Answers to Exercises
您的练习位于以下位置:
users.powernet.co.uk/eton/kandr2/krx121.html的
希望你觉得这有用。
真诚的,Morpfh
1:http://users.powernet.co.uk/eton/kandr2/index.html“C编程语言”,第2版,Kernighan和里奇-练习答案
kpbpu0088#
在上面的最佳答案中,程序过于复杂。为了简化这部分答案,我附上了一段简单得多的代码,希望是以K&R的风格编写的(主要是通过++内联递增)。
包含
define TAB 4
int main()函数{
字符串
}
vptzau2j9#
还有一个更简洁的解决方案,尽管它没有采用可用的最佳代码实践(滥用短路评估,通过continue进行笨拙的控制流,有点奇怪的“空间”循环)。
字符串
除了空格之外,读取的每一个字符都被逐字打印。空格被计数。如果程序遇到一个非空格字符,它将打印之前计数过的空格,然后重置计数器。如果遇到一个空格,它将通过第二个计数器进行检查如果光标在制表位上,则打印(从行首/最后一个制表位开始的打印字符)。如果是,则打印制表符,否则仅计算空白。
输入中的一个制表符被处理为重置空格计数器并输出该制表符,从而消除该过程中的任何多余空格。