黑马程序员技术交流社区

标题: segmentation fault: 11 是怎么回事? [打印本页]

作者: Moebius    时间: 2014-7-6 17:14
标题: segmentation fault: 11 是怎么回事?
本帖最后由 Moebius 于 2014-7-6 23:06 编辑

#include <stdio.h>
#include <string.h>
int main()
{
        char c[100];
        printf("请输入英文名句子:\n");
        scanf("%s",&c);
        for(int i=0;c!='\0';i++)
        {  //A~Z 为65~90 a~z 为97~122
           if((c>=65 && c<=87)|| (c>=97 && c<=119))
                {
                    for(int j=strlen(c);j>i;j--)
                    {
                        c[j+1]=c[j-1];
                    }
                    c=c+1;
                    c[i+1]=c+2;
                    c[i+2]=c+3;
                }
           if(c==88)
                {
                   for(int j=strlen(c);j>i;j--)
                    {
                        c[j+1]=c[j-1];
                    }
                   c=c+1;
                   c[i+1]=c+2;
                   c[i+2]=97;
                }
           if(c==89)
                {
                   for(int j=strlen(c);j>i;j--)
                    {
                        c[j+1]=c[j-1];
                    }
                   c=c+1;
                   c[i+1]=97;
                   c[i+2]=98;
                }
           if(c==90)
                {
                   for(int j=strlen(c);j>i;j--)
                    {
                        c[j+1]=c[j-1];
                    }
                   c=97;
                   c[i+1]=98;
                   c[i+2]=99;
                }
           if(c==120)
                {
                   for(int j=strlen(c);j>i;j--)
                    {
                        c[j+1]=c[j-1];
                    }
                   c=c+1;
                   c[i+1]=c+2;
                   c[i+2]=65;
                }
           if(c==121)
                {
                   for(int j=strlen(c);j>i;j--)
                    {
                        c[j+1]=c[j-1];
                    }
                   c=c+1;
                   c[i+1]=65;
                   c[i+2]=66;
                }
           if(c==122)
                {
                   for(int j=strlen(c);j>i;j--)
                    {
                        c[j+1]=c[j-1];
                    }
                   c=65;
                   c[i+1]=66;
                   c[i+2]=67;
                }
        }
        for(int i=0;i<strlen(c);i++)
                {
                        printf("%c\n",c);
                }
   
        return 0;
}
这段代码运行后出现 segmentation fault: 11 是怎么回事?

作者: Moebius    时间: 2014-7-6 17:23
编程实现对键盘输入的英文名句子进行加密。用加密方法为:当内容为英文字母时,用26字母中的其后三个字母代替该字母,若为其它字符时不变。比如245a95n加密后是245bcd95opq。 这个是题目,编译没问题,就是运行的时候出错。
作者: fantacyleo    时间: 2014-7-6 19:23
本帖最后由 fantacyleo 于 2014-7-6 19:43 编辑

段错误。简单来说就是你访问了不允许访问的内存地址。从你的程序来看:一是存在下标越界。
  for(int j=strlen(c);j>i;j--)
这一行,j的初始值strlen(c)如果作为数组下标来用,指向的是字符串末尾的'\0',你访问c[j+1]就越界了。二是你的c[j+1] = c[j-1]会把c数组末尾的'\0'覆盖掉,导致找不到字符串的结尾,不断向前访问,实际上  for(int i=0;c!='\0';i++)类似于死循环,不过当走到某个不允许访问的内存地址就会段错误,程序终止

作者: Moebius    时间: 2014-7-6 21:03
fantacyleo 发表于 2014-7-6 19:23
段错误。简单来说就是你访问了不允许访问的内存地址。从你的程序来看:一是存在下标越界。
  for(int j=str ...

这个题是用三个字符代替一个,字符串的长度会增加,这个怎么办?
作者: fantacyleo    时间: 2014-7-6 21:14
Moebius 发表于 2014-7-6 21:03
这个题是用三个字符代替一个,字符串的长度会增加,这个怎么办?

那最好重新声明一个字符数组,遍历旧数组,把结果输出到新数组中,最后加上'\0',就不容易出现越界了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2