从文本行的两边删除空格

时间:2014-09-09 18:27:20

标签: c text tabs space

我应该编写一个简单的程序来删除它们的尾随空格和制表符。它应该用C中最基本的工具编写(无指针和库)。

/* 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 gettline(char s[], int lim);
void inspect_line(char s[], int limit, int start, int end);

main()
{
    int len, i, start, end;
    start = 0;
    end = MAXLINE;
    char line[MAXLINE];
    while ((len = gettline(line, MAXLINE)) > 0){
            inspect_line(line, MAXLINE, start, end);
            for(i=start; i<end-1;++i)
                printf("%c",line[i]);
        }
    printf("\n");   
    return 0;
}

/* gettline: read a line into s, return length */
int gettline(char s[], int lim)
{
    int c, i;
    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;
}

/* inspect_line: determines the indices to the start and the end of the sentence */
void inspect_line(char s[], int limit, int start, int end)
{
    while((s[start]!=' ') && (start<limit-1))
        ++start;
    while(!(s[end]>=33 && s[end]<=126))
        --end;
}

当我运行它时,我得到一个奇怪的结果:

enter image description here

我不确定问题是什么,我一直试图调试它几个小时没有结果。

1 个答案:

答案 0 :(得分:2)

这是发生了什么:当你写

inspect_line(line, MAXLINE, start, end);
for(i=start; i<end-1;++i)
    printf("%c",line[i]);

您认为start函数中设置为endinspect_line的值将转移到main;那个假设是不正确的。在C中,参数按值传递。这就是startend保持呼叫前的原因。

您可以通过将指向startend的指针传递到inspect_line函数来解决此问题。当然,您还需要将函数更改为接受和使用指针:

void inspect_line(char s[], int *start, int *end)
{
    while(isspace(s[*start]) && (*start < *end))
        ++(*start);
    while(isspace(s[*end]) && (*start < *end))
        --(*end);
}

电话会是这样的:

// Note that passing MAXLINE is no longer necessary
inspect_line(line, &start, &end);
for(i=start ; i <= end-1 ; ++i) // both start and end are inclusive
    printf("%c",line[i]);

您还需要在循环的每次迭代之间重新初始化startend,将start设置为零,将end设置为当前值{{ 1}}。