尾随字符行结尾仍然在第一行结束时给出0920

时间:2015-06-08 05:53:54

标签: c

任务是从输入行的末尾删除空格和制表符,以保持行数。不能使用字符串库。我已经完成了所有我可以拥有的并且仍然在输出文件中,在第一行结束时有0920(使用八进制转储od -x trim.out)任何想法它还有什么问题呢?

#define LINELIM 1000

int getLine(char s[], int lim);

int main (void){
    int  len, i;
    char line1[100];

    while ((len = getLine(line1, LINELIM)) >0){
            for (i=len-2; i>=0; i--){
            if (line1[i] == ' ' || line1[i] == '\t' || line1[i] == '\n'){
                   // professor says it is always true for some reason
                line1[i] = '\0';
            }
            else break;
        }

    if(line1[0]) // not a blank
        printf(" %s\n", line1);
    }

return 0;
}
/*getline: read a line into s, return length*/
int getLine(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;
}

1 个答案:

答案 0 :(得分:1)

首先,您必须包含标题<stdio.h>

#include <stdio.h>

如果使用第二个参数等于LINELIM

调用该函数
getLine(line1, LINELIM)

然后line1必须定义相同的大小

char line1[LINELIM];

至于我,我会用以下方式重写函数getline:)

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

    int i = 0;

    while ( i < lim - 1 && ( c = getchar() ) != EOF && ( s[i++] = c ) !='\n' ); 

    s[i] = '\0';

    return i;
}

main中的主循环可以写成

while ( ( len = getLine( line1, LINELIM ) ) > 0 )
{
    int i = len;

    while ( i != 0 && ( line1[i-1] == ' ' || line1[i-1] == '\t' || line1[i-1] == '\n' ) ) --i;

    line1[i] = '\0';

    if ( line1[0] ) printf( "%s\n", line1 );
}

你应该在while循环中从main移动i的声明,因为除了while循环之外,变量不会在main中的任何地方使用。

至于您的代码,然后将i设置为len - 2是不正确的。

for (i=len-2; i>=0; i--){
     ^^^^^^

我们假设line1仅包含换行符'\n'。在这种情况下,len等于1,因此我将等于-1。因此,不会删除尾随的新行字符。