这个练习快把我逼疯了。抱歉,如果我的编程问题看起来很小,但我是初学者,所以请多多包涵。
该练习要求以下内容: 编写一个程序,从每行输入中删除尾随空白和制表符,并删除整个空白行。
谁能告诉我为什么我的代码不起作用?我还没有解决完全空白行的问题,但我找不到我的代码不删除尾随空白和制表符的任何原因。在这里:
#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
请注意,预期输出后没有空格。
但是,我得到的输出是无限打印输入的第一个字符。
更新:当从键盘输入时,我的代码按预期工作,但当从另一个文件输入时,我仍然会重复一个字符。我的心被震撼了。
最佳答案
问题是你的这部分代码:
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
)
关于c - K&R The C Programming Language 中的练习 1-18,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27083904/