Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C ROT13实现中的分段故障和警告_C_Segmentation Fault - Fatal编程技术网

C ROT13实现中的分段故障和警告

C ROT13实现中的分段故障和警告,c,segmentation-fault,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

我正在编写一个实现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;

我需要帮助了解警告以及如何解决问题,谢谢

函数的返回类型为“char”,但您正在尝试返回char*

此外,在这个片段中:

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

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

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

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

另一个主要问题是您的代码试图更改字符串文字(
“aaa”
在C中被认为是未定义的行为。编译器可以自由地将字符串文本存储在只读内存区域中


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

您的函数说它返回一个
字符
,但您试图返回一个
字符
数组。由于您正在修改数组,因此实际上不需要返回任何内容。即使不允许字母超过
'm'
,您仍在将
j
从0循环到25<代码>abc[j+13]越界。这不仅是一个主要问题,而且也是导致SEG故障的真正原因。好样的!那么,是否存在使用字符串文字的代码rot13的替代方案?或者我必须强制使用指针?只需将变量声明为
char buffer[]=“something”
,并将其传递给函数。您可以安全地写入
缓冲区
,因为它不是字符串文字。另一个选项是使用类似于
char*rot13(char*output,size\u t size,const char*input){…}
的函数。您从输入读取数据,但向输出写入数据,并且写入的数据不超过
size
字节(包括nul终止符)。很好,它工作正常!我还将函数更改为void并修复参数j,函数可以工作,但我唯一不能理解的是,我想返回新的char palabra[](使用ROT13)。我该怎么做?您需要使用
malloc
来分配一个新的缓冲区,向它写入字节,然后返回它。。
if(palabra[0] == abc[26]) {
    palabra[0] = abc[26 + 13]; //Segmentation Violation
}