在返回分段错误的 strcpy 函数处的 ceasar 密码中断程序



>我用C语言编写了一个程序来探索剖腹产密码,但是当我运行它时,我总是遇到分段错误。下面是代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char ceaserEncrypt(char string[1000000],int key);

int main(int *argc,char *argv[])
{
char str[1000000] = "Hi there I am fine";
int key = 20;
char val[1000000];
strcpy(val,ceaserEncrypt(str,key));
printf("%s",val);
return 0;
}


char ceaserEncrypt(char string[1000000],int key)
{
int len = strlen(string);
char encryptlis[len];
if(key < 1 || key > 26)
{
fprintf(stderr,"Key provided is invalid");
exit(-1);
}
for(int i = 0; i < len; i++)
{
if(string[i] = ' '){
encryptlis[i] = ' ';
continue;
}
int charcode = string[i] + key;
if(charcode > 122)
{
encryptlis[i] = (char) (charcode - 25);
}
encryptlis[i] = (char) charcode;
}

return encryptlis;
}
Operating system: Ubuntu 18.04 LTS
Processor: Intel celeron 
RAM Size: 4Gb
compiler: gcc

我知道分段错误。但是在这个程序中,我没有看到我在哪里访问了非法内存位置,因为我为 encrpylis 和 val 数组提供了足够的大小。 顺便说一句,我是 C 的新手。欢迎任何建议。谢谢你了。

分段错误的主要原因是您正在尝试访问未初始化的内存位置。

字符串encryptlis未初始化。

函数ceaserEncrypt的返回类型不正确。

此外,应遵循将字符串作为参数传递给函数的约定:将 C 字符串传递给函数的公认约定是使用指针。

看看下面的工作实现:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char* ceaserEncrypt(char* string,int key);

int main(int argc,char *argv[]){
char str[100000] = "Hi there I am fine";
int key = 20;
char val[100000];
strcpy(val,ceaserEncrypt(str,key));
printf("%s",val);
return 0;
}
char* ceaserEncrypt(char* string,int key)
{
int len = strlen(string);
char* encryptlis = (char*)(malloc((len+1) * sizeof(char)));

if(key < 1 || key > 26)
{
fprintf(stderr,"Key provided is invalid");
exit(-1);
}
for(int i = 0; i < len; i++)
{
if(string[i] == ' '){
encryptlis[i] = ' ';
continue;
}
int charcode = string[i] + key;
if(charcode > 122)
{
encryptlis[i] = (char) (charcode - 25);
}
else{
encryptlis[i] = (char) charcode;
}
}
encryptlis[len] = '';
return encryptlis;
}

最新更新