K&R 1.21,当插入打印阵列新线时

Bab*_*ack 1 c kernighan-and-ritchie

我正在通过K&R工作,我对我的程序的输出有点了解,当按下tab而不是在char数组行中插入一个tab时,if语句用于插入8个空白字符; 然而,当我按下回车键而不是获得所需的输出时,我的单词被换行符而不是空格或空格.问题1.21为好奇

    /*replaces tabs from input with equal number of spaces*/
#include <stdio.h>
#define MAXLINE 1000
int getliner(int maxlen, char line[]);
int main(){
    char line[MAXLINE];
    int len=0;
    while((len=getliner(MAXLINE, line))>0){
        printf("%s\n", line);
        len=0;
    }
    return 0;
}
/*getline: puts input in arr, returns lenght*/
int getliner(int max, char s[]){
    int i, j;
    char c;

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

}
Run Code Online (Sandbox Code Playgroud)

输出的一个例子

dom     dom   <-- this is the input
dom            <-- here is the output
dom
Run Code Online (Sandbox Code Playgroud)

从我可以告诉我的代码处理换行符char,不仅是换行直到输入的最后'm'之后才出现.在我看来,当按Tab键时,'\n'字符被插入到该行中,但我的代码添加了8个空格.

Car*_*rum 5

您的字符串已包含换行符(您从输入中复制),但您正在打印:

    printf("%s\n", line);
Run Code Online (Sandbox Code Playgroud)

这增加了另一个换行符.