我正在编码一个实现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;
我需要帮助来了解警告以及如何解决问题,谢谢!
答案 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中传递要更新的数组。