gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 15:05:01 27 4
gpt4 key购买 nike

我正在进行 K&R 的练习 1-18

Write a program to remove trailing blanks and tabs from each line of input, and to delete entirely blank lines.

这是我目前的想法

#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;
}

第二部分听起来很难,因为我不确定如果该行只有空格或制表符我应该返回什么。毕竟,如果我返回 0,它将停止 getline() 调用。这是我应该设置 #define 的地方吗,例如 ALL_BLANKS

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

最佳答案

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

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

#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;
}

这是我前段时间写的第 1 类解决方案。 getline 与本书第 28 页相同。将空格的删除放在单独的函数 rstrip 中可能会更好,但我将其作为练习留给读者。

关于c - 这个小的 C 程序是否满足 K&R 练习?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3467885/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com