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中输入一行并按下回车键时,它会自动打印出来.我应该构建一个行数组,然后在完成后循环并打印它们吗?
你的代码看起来是正确的,但我认为如果你分开读取一行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,但我将此作为练习留给读者.
| 归档时间: |
|
| 查看次数: |
1982 次 |
| 最近记录: |