Я не могу понять эту ошибку сегментации - PullRequest
1 голос
/ 01 мая 2019

Предисловие: Я очень новичок в программировании и 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 ]

4 голосов
/ 01 мая 2019

Строка j == i; не вызывает проблемы, она ничего не делает.Проблема здесь:

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

Вы пытаетесь напечатать строку, но вы даете ей c, то есть int.Передача неверного типа данных в printf является неопределенным поведением, и это является причиной вашей ошибки сегментации.Вы, вероятно, хотели вместо этого:

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

Также обратите внимание, что вы еще не завершили строку на нуль.В вашей функции reverse вам нужно это:

printf("BEFORE REVERSING\n");
line[i] = '\0';
2 голосов
/ 01 мая 2019

Линия 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.

...