ROT13实施中的分段故障和警告

时间:2018-10-05 23:44:09

标签: c segmentation-fault

我正在编码一个实现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 :(得分:1)

另一个主要问题是您的代码正在尝试更改字符串文字"aaa",这在C语言中被视为未定义的行为。编译器可以自由地将字符串文字存储在只读内存区域中。

它正在palabra[i]=abc[j+13];中执行,您将在其中覆盖输入参数的每个字节。

答案 1 :(得分:0)

函数的返回类型为'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
}

答案 2 :(得分:0)

到目前为止,我已经看到了两个问题。

第一个在第10行中,即"palabra[i]=abc[j+13];" abc 数组的大小为27个元素,因此当j大于13时,此语句将溢出其最大大小。

第二个是char rot13(char palavra[])函数的返回。该函数期望返回一个char,但是您将返回一个数组。 另外,该函数可能是void rot13(char palavra[]),因为您不需要返回任何内容,因此可以在函数rot13中传递要更新的数组。