这个小C程序是否满足K&R练习?

ale*_*lex 5 c kernighan-and-ritchie

我正在参加K&R的练习1-18

编写程序以从每行输入中删除尾随空白和制表符,并删除完全空行.

这是我到目前为止所提出的

#include <stdio.h>

#define MAXLINE 1000

int getline(char line[], int maxline);
void copy(char to[], char from[]);

int main () {

    int len;
    char line[MAXLINE];

    while (getline(line, MAXLINE) > 0) {
            printf("%s", line);
    }
    return 0;
}


int getline(char s[], int lim) {
    int c, i, lastNonBlankIndex;
    lastNonBlankIndex = 0;

    for (i=0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i) {

        if (c != ' ' && c != '\t') {
            lastNonBlankIndex = i + 1;

        } 

        s[i] = c;
    }

    if (i != lastNonBlankIndex) {
        i = lastNonBlankIndex;
        c = '\n';
    }

    if (c == '\n') {
        s[i] = c;   
        ++i;
    }
    s[i] = '\0';
    return i;
}
Run Code Online (Sandbox Code Playgroud)

第二部分听起来很难,因为如果线只有空格或标签,我不确定应该返回什么.毕竟,如果我返回0,它将停止getline()呼叫.这是我应该建立的地方#define,例如ALL_BLANKS.

无论如何,对于实际的主要问题,这是从行中删除尾随空白和制表符的正确方法吗?我通过了一些输入,它似乎工作.但是,如果我将带有换行符的文本复制并粘贴到CL中,它们会显示在一起.当我在CL中输入一行并按下回车键时,它会自动打印出来.我应该构建一个行数组,然后在完成后循环并打印它们吗?

sch*_*hot 5

你的代码看起来是正确的,但我认为如果你分开读取一行stdin和删除尾随空格行(解耦)的操作会更好.然后你可以使用getline书中的未修改(代码重用),并且不会有返回0时停止的问题.

如果您对其他解决方案感兴趣,CLC-wiki有几乎完整的K&R2解决方案列表.

#include <stdio.h>
#define MAXLINE 1024

int getline(char s[], int lim);

main()
{
    int i, len;
    char line[MAXLINE];

    while ((len = getline(line, MAXLINE)) > 0) {
        i = len - 2;
        while (i >= 0 && (line[i] == ' ' || line[i] == '\t'))
            --i;
        if (i >= 0) {
            line[i+1] = '\n';
            line[i+2] = '\0';
            printf("%s", line);
        }
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是我前一段时间写的第1类解决方案.getline如本书第28页所述.将空格移除到单独的函数中可能更好rstrip,但我将此作为练习留给读者.