Ошибка сегментации и предупреждение в реализации ROT13 - PullRequest
0 голосов
/ 06 октября 2018

Я кодирую функцию, которая реализует rot13, я делаю только случай a, b, ..., m (+13), но у меня есть ошибка ошибки сегментации и предупреждение:

КОД:

#include <stdio.h>
#include <string.h>
char rot13(char palabra[]) { //char *palabra
    int y = (short) strlen(palabra);
    char abc[27]="abcdefghijklmnopqrstuvwxyz";
    for (int i = 0; i < y ; ++i) {
        if(palabra[i]<'m' && palabra[i]>='a'){
            for (int j = 0; j <26 ; ++j) {
                if (palabra[i]==abc[j]){
                    palabra[i]=abc[j+13];
                }
            }    
        }    
    }

    return palabra;
}

int main() {
    rot13("aaa");
    return 0;
}

ПРЕДУПРЕЖДЕНИЕ:

main.c:18:12: warning: return makes integer from pointer without a cast [-Wint-conversion]
     return palabra;

Мне нужна помощь, чтобы понять предупреждение и как решить проблему, спасибо!

Ответы [ 3 ]

0 голосов
/ 06 октября 2018

До сих пор я видел две проблемы.

Первая находится в строке 10, которая "palabra[i]=abc[j+13];".Массив abc имеет размер 27 элементов, поэтому этот оператор переполняет свой максимальный размер, когда j больше 13.

Второй - возвращение функции char rot13(char palavra[]).Эта функция ожидает возврата символа, но вместо этого вы возвращаете массив.Кроме того, эта функция может быть void rot13(char palavra[]), потому что вам не нужно ничего возвращать, вы передаете массив, который вы обновляете, внутри функции rot13.

0 голосов
/ 06 октября 2018

Другая серьезная проблема заключается в том, что ваш код пытается изменить строковый литерал ("aaa") , который считается неопределенным поведением в C .Компиляторы могут хранить строковые литералы в области памяти, доступной только для чтения.

Это выполняется в palabra[i]=abc[j+13];, где вы перезаписываете каждый байт входного параметра.

0 голосов
/ 06 октября 2018

Тип возврата вашей функции - char, но вы пытаетесь вернуть char *.

Также в этом фрагменте:

for (int j = 0; j <26 ; ++j) {
    if (palabra[i] == abc[j]) {
        palabra[i] = abc[j+13];
    }

abc являетсямассив с 27 элементами.Индекс i равен 0. Первый 'a' соответствует, а palabra[0] становится 'n'.i пока не увеличивается, но позже в том же цикле, palabra [0] == abc [13], что приводит к palabra[i] = abc[13+13] (завершающий '\ 0').Несколько итераций спустя ваш отладчик должен показать:

if(palabra[0] == abc[26]) {
    palabra[0] = abc[26 + 13]; //Segmentation Violation
}
...