Необъяснимая ошибка сегментации - PullRequest
0 голосов
/ 04 февраля 2020

Я пишу код для обращения массива char в каждой строке, которую я ввожу. Однако, когда я отлаживал программу, я столкнулся с ошибкой сегментации, и я не знаю почему. Вот мой код:

#include <stdio.h>
#define DEFAULT 1000

int reverse(char s[]);

main()
{
    int i;
    char line[DEFAULT] = {'\0'};
    while ((i = getline(line, DEFAULT)) != 0) {
        printf("%s", reverse(line));
    }   
    return 0;
}

/*reverse a line*/
int reverse(char s[])
{
    int i = 0, j = 0;
    while (s[i] != '\n')
        ++i;
    for (j = 0; j < i; ++j) {
        s[2 * i - j] = s[j];
    }
    for (j = 0; j < i; ++j) {
        s[j] = s[j + i + 1];
        s[j + i + 1] = '\0';
    }
    return i;
}

/*get a line from input stream*/
int getline(char s[], int lim)
{
     int i, c, j = 0;
     for (i = 0; ((c = getchar()) != EOF) && (c != '\n'); ++i) {        
        if (i < lim - 2) {
            s[j] = c;   // use j to prevent index out of bounds
            ++j;
        }
     }
     if (c == '\n') {
        s[j] = c;
        ++j;
     }
     s[j] = '\0';
     return i;  // return the length of char s[]
} 

Когда я ввожу «abc \ n» и выполняю reverse (s), содержимое в s становится «cba \ n», а я ссылаюсь на 3, все Ладно. Ошибка сегментации возникает, когда я выхожу из этой функции.

Вот еще несколько деталей:

Complier: G CC 4.9.2 64-разрядная версия

Система: Windows 10

1 Ответ

2 голосов
/ 04 февраля 2020

Ваша функция int reverse(char s[]) возвращает int, а затем вы пытаетесь напечатать полученный int в виде строки:

printf("%s", reverse(line));

Если вы хотите использовать такую ​​функцию, как эта , вы можете изменить его подпись, чтобы она возвращала char* вместо:

char* reverse(char s[]);

И затем возвращать s, который вы даете в качестве параметра. Ваш компилятор должен выдать предупреждение о присвоении неправильного типа параметра printf. Если нет, попробуйте сделать его более строгим с предупреждениями.

...