【问题标题】:Exercise 1-18 in K&R The C Programming LanguageK&R C 编程语言中的练习 1-18
【发布时间】:2014-11-22 23:48:24
【问题描述】:

这个练习快把我逼疯了。对不起,如果我的编程问题看起来很小,但我是初学者,所以请多多包涵。

练习要求以下内容: 编写一个程序,从输入的每一行中删除尾随空格和制表符,并删除整个空白行。

谁能告诉我为什么我的代码不起作用?我还没有解决完全空白行的问题,但我找不到任何理由说明我的代码不会删除尾随空格和制表符。这里是:

#include <stdio.h>

#define MAXLINE 1000

int better_line_length(char line[], int lim);
void copy(char to[], char from[]);

int main(void)
{
    int len;
    char s[MAXLINE];
    char better_s[MAXLINE];

    while ((len = better_line_length(s, MAXLINE)) > 0) {
        copy(better_s, s);
        printf("%s\n", better_s); 
    }

    return 0;
}

int better_line_length(char s[], int lim)
{
    int c, i, last_letter;

    for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i) {
        s[i] = c;
        if (c != ' ' && c != '\t')
            last_letter = i;
    }

    s[last_letter+1] = '\0';

    return last_letter+1;
}

void copy(char to[], char from[]) 
{
    int i = 0;

    while ((to[i] = from[i]) != '\0')
        ++i;
}

例如,我希望代码如下工作:如果我的输入是这样的(其中“▯”表示空格):

abcdefg▯▯▯▯▯▯▯▯▯▯▯▯

我希望输出是

abcdefg

请注意,预期输出后没有空格。

但是,我得到的输出是输入的第一个字符的无限打印。

更新:当从键盘输入时,我的代码按预期工作,但当从另一个文件输入时,我仍然会重复一个字符。我的心都碎了。

【问题讨论】:

  • 您的计算机上有调试器吗?一次运行一行代码会显示你哪里出错了。
  • 问问自己last_letterreturn last\_letter+1; 有什么价值,当您使用nonelast_letter 设置为anything ? (空格和制表符) ?注意,它没有初始值。一旦你解决了这个问题,除非last_letter+1 以某种方式等于零,否则你仍然处于热水中。

标签: c kernighan-and-ritchie


【解决方案1】:

问题在于您的这部分代码:

while ((len = better_line_length(s, MAXLINE)) > 0) {
    copy(better_s, s);
    printf("%s\n", better_s); 
}

它会无限迭代,因为(len = better_line_length(s, MAXLINE)) 的结果总是大于 0(对于至少有 1 个字符的字符串)。

您不需要while 循环。相反,这样做:

len = better_line_length(s, MAXLINE);
copy(better_s, s);
printf("%s|\n", better_s); 

(另请注意,您不要在任何地方使用len

【讨论】:

  • 感谢您的帮助,但我仍然需要一个循环来输入多行。
  • 您实际上只是通过指出 (len = better_line_length(s, MAXLINE)) 始终大于 0 来引导我回答我自己的问题。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多