A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Moebius 中级黑马   /  2014-7-6 17:14  /  2268 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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 是怎么回事?

4 个回复

倒序浏览
编程实现对键盘输入的英文名句子进行加密。用加密方法为:当内容为英文字母时,用26字母中的其后三个字母代替该字母,若为其它字符时不变。比如245a95n加密后是245bcd95opq。 这个是题目,编译没问题,就是运行的时候出错。
回复 使用道具 举报
本帖最后由 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++)类似于死循环,不过当走到某个不允许访问的内存地址就会段错误,程序终止
回复 使用道具 举报
fantacyleo 发表于 2014-7-6 19:23
段错误。简单来说就是你访问了不允许访问的内存地址。从你的程序来看:一是存在下标越界。
  for(int j=str ...

这个题是用三个字符代替一个,字符串的长度会增加,这个怎么办?
回复 使用道具 举报
Moebius 发表于 2014-7-6 21:03
这个题是用三个字符代替一个,字符串的长度会增加,这个怎么办?

那最好重新声明一个字符数组,遍历旧数组,把结果输出到新数组中,最后加上'\0',就不容易出现越界了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马