在k& r book exercise 1.18中编写一个程序,从每行输入中删除尾随空白和制表符,并删除完全空行

时间:2015-07-21 13:58:29

标签: c arrays

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


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

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

  return i;
}

这是我的程序,我累了,但似乎显示相同的输入没有任何变化。我无法理解我做了什么错误.... 提前谢谢。

4 个答案:

答案 0 :(得分:1)

getline函数会增加i '\n'(返回的长度)'\0',但不会终止i = len - 2;

因此,在i = len - 1;中你应该减去一个而不是两个......对吗?为了澄清,我建议您尝试@Override public void onApplicationEvent(SessionSubscribeEvent event) { Message<byte[]> message = event.getMessage(); StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message); StompCommand command = accessor.getCommand(); if (command.equals(StompCommand.SUBSCRIBE)) { String sessionId = accessor.getSessionId(); String stompSubscriptionId = accessor.getSubscriptionId(); String destination = accessor.getDestination(); // Handle subscription event here // e.g. send welcome message to *destination* } }

答案 1 :(得分:0)

以下是一些有用的提示。

  • 已经有一个函数getline(),你正在推翻这个名字。如果您提高编译警告级别,那么您可能会看到警告。无论如何,假设您想拥有自己的行读取功能,可以将其更改为my_getline()。如果你这样做,那么你的程序适合我。
  • 同样,您main()的声明并不像int main()中那样具有类型。没关系,默认类型是int,但为了整洁&#39;为此,你应该把类型放在那里(同样,当你提高警告级别时,为了避免编译警告)。
  • 您的程序无法处理长度超过1024个字符的行。如果你能忍受这个限制,那就没问题了。如果你想摆脱这个限制,那么你想要以这样的方式连接my_getline(),它会返回一个指向已分配内存的指针,该内存包含它读取的整行文本。在main()中,您可以删除尾随空格等,然后free()内存。在这种情况下,my_getline()的原型当然是char *my_getline()

答案 2 :(得分:0)

在删除空格字符(空格,制表符)后检查字符数,然后在删除空格之前与不使用字符进行比较。如果他们的不同,你的计划有效..

由于我们在这里处理空白字符,你将无法看到输入和输出的差异。

答案 3 :(得分:0)

以下解决方案适用于我。请注意,我尚未定义任何新功能。

#include <stdio.h>
#define MAXLINE 1000
#define INLINE 1
#define OUTLINE 0

int main(void) {
    int i = 0, j, c;
    char line[MAXLINE];
    int status = OUTLINE;
    while((c = getchar()) != EOF) {
        if (c != '\n') {
            line[i] = c;
            i++;
        } else if (c == '\n'){
            line[i] = '\n';
            line[i+1] = '\0';
            for (j = i; j >= 0 && status == OUTLINE; j--) {
                char lc = line[j];
                if (lc == ' ' || lc == '\t') {
                    line[j] = '\n';
                    line[j+1] = '\0';
                    status = INLINE;
                }
            }
            printf("%s", line);
            for (j = 0; j < MAXLINE; j++) {
                line[j] = 0;
            }
            i = 0;
        }
    }

    return 0;
}