练习1-18在K&R C编程语言中

这个练习让我发疯。 对不起,如果我的编程问题看起来很小,但我是初学者,所以请耐心等待。

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

任何人都可以告诉我为什么我的代码不起作用? 我还没有解决完全空行的问题,但我找不到任何理由为什么我的代码不会删除尾随空白和标签。 这里是:

#include  #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 

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

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

更新:当从键盘输入时,我的代码按预期工作,但是当从另一个文件中获取输入时,我仍然会重复一个字符。 我的思绪被吹了。

问题是你的代码的这一部分:

 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