我正在编写一个实现 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;
我需要帮助来理解警告以及如何解决问题,谢谢!
另一个主要问题是你的代码试图改变字符串文字("aaa"
(,这在C中被认为是未定义的行为。编译器可以自由地将字符串文本存储在只读内存区域中。
它在palabra[i]=abc[j+13];
中执行此操作,您可以在其中覆盖输入参数的每个字节。
函数的返回类型是"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
}
到目前为止,我已经看到了两个问题。
第一个在第 10 行,即"palabra[i]=abc[j+13];"
.abc数组的大小为 27 个元素,因此当 j 大于 13 时,此语句会溢出其最大大小。
第二个是返回char rot13(char palavra[])
函数。此函数需要返回 char,但您返回的是数组。 此外,这个函数可能是void rot13(char palavra[])
的,因为你不需要返回任何东西,你正在函数 rot13 中传递你要更新的数组。