我不明白这种细分错误

时间:2019-05-01 12:47:59

标签: c arrays segmentation-fault runtime-error

作为序言:我对编程和C语言都非常陌生。我正在经历K&R,我正在尝试解决练习1-19。

我不明白是什么导致了j == i;行中的分段错误。

我一直在尝试各种代码组合来找出问题所在。

按照练习,我最初有一个循环来尝试反转字符数组,但是通过故障排除,我得出了j == i;线。

这两个值似乎没什么问题,但是尝试比较它们会给我一个错误。

#include <stdio.h>
#define MAXLENGTH 1000
int reverse(char line[]);

main()
{
  int c = 0;
  char line[MAXLENGTH];

  while ((c = reverse(line)) != EOF) {
    printf("%s\n", c);
  }

  return 0;
}

int reverse(char line[])
{
  char r[MAXLENGTH];

  int i, c, j, l;
  i = c = j = l = 0;

  printf("BEFORE GETARRAY\n");
  while ((c = getchar()) != '\n' && c != EOF) {
    line[i] = c;
    i++;
    printf("i: %d\n", i);
  }

  l = i - 1;
  printf("i: %d\n", i);
  printf("l: %d\n", l);
  printf("j: %d\n", j);
  printf("BEFORE REVERSING\n");

  j == i;
  return c;

我希望比较能够毫无错误地结束。

如果您不仅可以描述错误所在,还可以描述原因,以便我可以尝试改进,那将是很棒的事情。

2 个答案:

答案 0 :(得分:3)

j == i;行未引起此问题,它没有执行任何操作。问题在这里:

while ((c = reverse(line)) != EOF) {
    printf("%s\n", c);
}

您正在尝试打印一个字符串,但您给了它c,它是一个int。将错误的数据类型传递给printf是未定义的行为,这就是导致分段错误的原因。您可能想要这样:

printf("%s\n", line);

还请注意,您尚未对字符串进行null终止。在reverse函数中,您需要:

printf("BEFORE REVERSING\n");
line[i] = '\0';

答案 1 :(得分:2)

j == i行与您的细分错误完全无关。细分错误的主要问题是您的printf("%s\n", c);语句。因为您尝试在传递int作为参数的同时打印字符串。如果要打印getchar的结果,可以使用函数putchar或作为替代方法printf("%c")。试试这个,它应该不会崩溃。

#include <stdio.h>
#define MAXLENGTH 1000
int reverse(char line[]);

int main()
{
    int c = 0;
    char line[MAXLENGTH];

    while ((c = reverse(line)) != EOF) {
        putchar(c);
    }

    return 0;
}

int reverse(char line[])
{

    int i, c, j, l;
    i = c = j = l = 0;

    printf("BEFORE GETARRAY\n");
    while ((c = getchar()) != '\n' && c != EOF) {
        line[i] = c;
        i++;
        printf("i: %d\n", i);
    }

    l = i - 1;
    printf("i: %d\n", i);
    printf("l: %d\n", l);
    printf("j: %d\n", j);
    printf("BEFORE REVERSING\n");

    return c;
}

我也删除了多余的j == i语句。