分段故障时的C

分段故障时的C,c,fault,C,Fault,为什么这会导致分割错误 我已经把我的程序调试到这一步了,这是一个错误?有人能解释一下原因吗 char code1[] = "abcdefghijklmnopqrstuvwxyz "; char code2[] = "bpduhijkaltxwmrzfoysvngeqc "; void code(char *encode[]){ char encoded[strlen(encode)]; strcpy (encoded, encode); int i = 0; i

为什么这会导致分割错误

我已经把我的程序调试到这一步了,这是一个错误?有人能解释一下原因吗

char code1[] = "abcdefghijklmnopqrstuvwxyz ";
char code2[] = "bpduhijkaltxwmrzfoysvngeqc ";

void code(char *encode[]){
    char encoded[strlen(encode)];
    strcpy (encoded, encode);
    int i = 0;
    int j = 0;
    while (encode[i] != '\0'){
        while(encode[i] != code1[j]){
            j++;
        }
    encoded[i] = code2[j];
    i++;
    j=0;
}
i=0;
printf("The word is: %s \n", encoded);

}

结果字符串中没有包含空字节
'\0'
。c字符串以长度中不包含的
'\0'
字符结尾:

char encoded[strlen(encode)+1];
strcpy(encoded, encode);

您还需要检查以确保
encode
中的每个字符也在
code1
中,否则您将访问
code
之外的数据。您可以添加对
code1[j]='\0'
的检查并跳过该字符。您还应该查看
strchr
函数来搜索字符,而不是自己搜索。

这会运行,但不会按您预期的方式运行。问题在于编码和解码,这是另一个问题

char code1[] = "abcdefghijklmnopqrstuvwxyz ";
char code2[] = "bpduhijkaltxwmrzfoysvngeqc ";
char code3[99]={0};    

void code( char *encode[] )
{
  char encoded[strlen( encode )];
  strcpy( encoded, encode );
  int i = 0;
  int j = 0;
  while ( encode[i] != '\0' )
  {
    while ( encoded[i] != code1[j] )  // encoded not encode
    {
      j++;
    }
    encoded[i] = code2[j];
    i++;
    j = 0;
  }
  i = 0;
  printf( "The word is: %s \n", encoded );

}

int main(  )
{
  strcpy( code3 , "once upon a time there was a lost coder");
  code( code3 );
}

如果
encode[i]
不在
code1
中,会发生什么情况?同时查看
strchr
函数抱歉,我用变量更新了帖子。
char-encoded[strlen(encode)]
需要
字符编码[strlen(encode)+1]以容纳NUL终止符。如果在此之后仍然出现分段错误,请在调试器中运行程序(事实上,在寻求他人帮助之前,应该始终是这样)。您的类型是错误的。
code
的参数的类型应该是
char*
,而不是
char*[]
。为此,我仍然会收到更改的错误。您知道崩溃发生的确切位置吗?通过调试器运行代码。调试器指向这一行:while(encode[i]!=code1[j]){您是否包括在
code1
中找到字符的检查?当我使用code1时,它工作正常,但当我尝试使用随机字符串时,仍然会出现分段错误,例如:char cat[]=“the cat sat”;感谢您的帮助good spot BTW此解决方案到底解决了什么问题?此解决方案仍然与原始代码存在相同的问题。此解决方案解决了原始问题:分段错误。它运行时,原始代码没有。现在,还有另一个问题。不,它没有:
char-encoded[strlen(encode)];
。请参阅我的答案