C 将制表符转换为空格时出现分段错误

C 将制表符转换为空格时出现分段错误,c,C,我刚买了K&R的C编程语言,并尽我所能做了其中的练习如果你知道这本书,那就是练习1.20 该程序旨在从键盘获取输入,并将制表符转换为TABLENGTH指定的适当数量的空格 代码如下。当我试着运行它时,我得到了分段错误 detab.c: #include <stdio.h> #define TABLENGTH 8 #define MAXLINE 1000 int getline(char line[], int len); int main() { char line[M

我刚买了K&R的C编程语言,并尽我所能做了其中的练习如果你知道这本书,那就是练习1.20

该程序旨在从键盘获取输入,并将制表符转换为TABLENGTH指定的适当数量的空格

代码如下。当我试着运行它时,我得到了分段错误

detab.c:

#include <stdio.h>
#define TABLENGTH 8
#define MAXLINE 1000

int getline(char line[], int len);

int main()
{
    char line[MAXLINE];
    int length;

    while((length = getline(line, MAXLINE)) > 0) {
        printf("%s");
    }

}

int getline(char line[], int len)
{
  int i = 0;
  int c;

  for(i = 0; i < (MAXLINE - 1) &&
   ((c = getchar()) != EOF && c != '\n'); i++) {
   // if c is tab, replace with spaces
    if(c == '\t') {
        while((TABLENGTH - (i % TABLENGTH)) != 0) {
            line[i] = ' ';
            i++;
        }
        i--;
        continue;
    }
   }
   line[i] = c;
  }
  if(c == '\n') {
   line[i] = c;
   i++;
  }

  line[i] = '\0';
  return i;
}

典型的初学者错误1A:getchar返回int,因为EOF不适合字符

我还认为你有一个索引问题,因为如果你找到一个标签,你会在空间插入循环中增加I,然后for循环会再次增加I,在字符串中留下奇怪的东西。这可能会导致缓冲区溢出和您看到的崩溃

请注意,空间插入循环不会根据MAXLINE检查i。

对printf的调用

可能是SEG故障的原因。它将尝试将堆栈上的一些任意数据解释为指向以0结尾的字符数组的指针

segfault的一种特定方式是在“\t”情况下的循环:


由于i>=0且TABLENGTH>0,在seg故障的哪一行上始终有0?在第29行,第[i]='';根据gdb。while循环中似乎有一些不正常的逻辑。看看我更新的答案,我想我已经搞定了。这将通过在编译器标志中启用警告来标记,或者如果使用IDE,则可能通过在调试模式下编译来标记。在这一点上,我似乎比自己聪明。这很有魅力。非常感谢你!我尝试将if测试更改为上面的edit,并将printf更改为实际使用我想要的字符串,但仍然出现分段错误。但是,如果我的输入不包含制表符,我不会出现分段错误。我还将字符改为int,这是一个愚蠢的错误。
printf("%s");
if(c == '\t') {
    while((TABLENGTH - (i % TABLENGTH)) != 0) {
        line[i] = ' ';
        i++;
    }
    i--;
    continue;
}
if (c == '\t') {
    do {
        line[i] = ' ';
        ++i;
    }while(((TABLENGTH - (i % TABLENGTH)) % TABLENGTH) != 0);
    --i;
    continue;
}