2015-06-08 170 views
1

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

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

这是什么?使用'line1 [100]'',你正在传递'#define LINELIM 1000' ??? \ –

+4

有时间学习如何使用调试器,因为那样你可以逐行浏览代码,看看会发生什么,并检查变量的值和表达式的结果。 –

+0

我想建议你尝试一种不同的方法:首先 - 用'scanf'在一个步骤中读取整行,然后应用替换逻辑。第二 - 重写你的代码,它看起来很可怕并且不能真正维护(我保证你:在两天内你再也不会理解你的优点了)。第三 - 在你的代码中有一个巨大的错误,你可能会写出你的数组的边界 - 请参阅getLine函数的第三行。因此,重新思考问题/方法在这里会更好。 – ckruczek

回答

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

在主主循环可以这样写

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

您应该从主要移动内部的i声明while循环,因为除了while循环,变量在main中的任何地方都没有使用。

至于你的代码,然后设置ilen - 2是不正确的。

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

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

+0

感谢您花时间解释,我真的很感激。 1。getline函数的是任务的一部分(不能改变) 2.我试图宣布INT I内用于和gcc抱怨ANS说,通过新的标准只声明输出侧; -/ 3.的len的问候-2逻辑我以为那个行结束符\ o也算?如果它不是,我的路线是错误的。 –

+0

@Oleksandr Pimenov函数getline不包括终止零。至于在循环中声明变量i,它会显示在我的文章中。编译器都不会发出错误。 –