【问题标题】:K&R C Exercise 1-18 no output/debugging issuesK&R C 练习 1-18 没有输出/调试问题
【发布时间】:2016-02-20 01:16:49
【问题描述】:

我在 Code::Blocks 中编写了以下代码作为对 K&R C 练习 1-18 的响应:

编写一个程序,从每行删除尾随的空格和制表符 输入,并删除完全空白行。

我的意思是删除空格和制表符(我还没有处理空行部分)。 while 循环正确地将输入保存到字符数组 ip,但是,其余代码似乎无法正常工作,因为 EOF 根本没有非法 任何 输出。

#include <stdio.h>
#define MAXLINE 1000

main(){
    int c, z;
    char ip[MAXLINE];

    z = 0;

    while ((c = getchar()) != EOF) {
        ip[z] = c;
        ++z;
    }

    for (z = 0; ip[z] == ' ' || ip[z] == '\t'; ip[z] = ip[z + 1]);
    printf("%s", ip);

}

我试图利用这个问题来学习调试器,但在第 14 行添加断点后,打开监视窗口,然后按开始箭头,没有任何反应。在我的断点处没有出现黄色箭头,我的步骤选项是灰色的,我的变量名和它们的值都没有显示在监视窗口中。

非常感谢有关修复我的代码的建议,但我真正想知道的是我在做什么或不做什么会阻止调试器帮助我。

【问题讨论】:

  • 你有没有在stdin上提供任何意见?
  • 提示:如果您一次只访问一行输入而不是整个文件,这将容易得多。你的第二个循环完全是假的;除非输入的第一个字符是空格或制表符,否则根本不会触发。
  • 您将需要两个索引变量来打乱数组。一个用于源,一个用于目标。考虑一下如果您有多个空格或制表符会发生什么。偏移量 1 将不起作用。并且:请不要尝试将for 循环的工作主体放入其条件中——糟糕的风格。最后别忘了写一个新的字符串终止符'\0'
  • 您没有在for (z = 0;... 中增加z,当您重置z=0 时,您会丢失字符数,并且如果文件大于1000 字符,则您正在写入超出末尾while ((c = getchar()) != EOF) 中的数组,因为您正在将整个文件读入 ip
  • 本书第 29 页有一个getline 函数。我将从它开始。将整行放在内存中可以让您从行尾开始搜索第一个非空白字符。

标签: c arrays debugging codeblocks kernighan-and-ritchie


【解决方案1】:

如果您没有看到任何输出,那么这可能是因为您的程序卡在 for 循环中:for (z = 0; ip[z] ...,如果字符串 ip 以两个连续的空格和/或制表符开头,就会发生这种情况。

去除某个字符的算法是这样的:

有两个变量来索引字符串中的位置,目标和源。代码将在外循环内。源索引将在内部循环中迭代,直到找到不是必须删除的字符之一的字符或空字符。然后将源索引中的字符分配给目标索引。然后代码检查源索引是否达到空字符,如果达到则中断外循环。两个索引都递增,然后重复外部循环。

在伪代码中:

remove = '\t'
string
source = 0 
destin = 0

while
    while string at source equals remove and not-equals null character
        source++
    string at destin = string at source
    if string at source equals null character
        break
    source++
    destin++

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多