免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5566 | 回复: 11
打印 上一主题 下一主题

index函数出现Segmentation fault (core dumped) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-12 00:50 |只看该作者 |倒序浏览
代码如下:
实现一个简单的字符查找

#include <string.h>
#include <stdio.h>
main()
{
        char *p;
        char a[10];
        char b;
        printf("Enter a string:\n");
        scanf("%s",a);
        printf("Enter a char for search:\n");
        scanf("%s",&b);
        p=index(a,b);
        printf("The search char is:%c\n",*p);
}

但运行出现:Segmentation fault (core dumped)
通过gdb调试发现出错的是printf语句,取出*l的数值时出错,推理应该是上一语句p=index(a,b);执行时P指针变量没有得到正确的赋值。

后来发现只要把char a[10];和char b; 顺序对调就正常运行。。百思不得其解。。望DX指点。。

以下代码正常:
#include <string.h>
#include <stdio.h>
main()
{
        char *p;
        char b;
        char a[10];
        printf("Enter a string:\n");
        scanf("%s",a);
        printf("Enter a char for search:\n");
        scanf("%s",&b);
        p=index(a,b);
        printf("The search char is:%c\n",*p);
}

[ 本帖最后由 BSDUP 于 2009-3-12 02:16 编辑 ]

论坛徽章:
1
天蝎座
日期:2013-08-25 10:27:22
2 [报告]
发表于 2009-03-12 09:08 |只看该作者
scanf("%s",&b);

---->

scanf("%c",&b);

评分

参与人数 1可用积分 +5 收起 理由
langue + 5 我很赞同

查看全部评分

论坛徽章:
0
3 [报告]
发表于 2009-03-12 10:13 |只看该作者
原帖由 BSDUP 于 2009-3-12 00:50 发表

main()
{
        char *p;
        char a[10];
        char b;
        printf("Enter a string:\n");
        scanf("%s",a);
        printf("Enter a char for search:\n");
        scanf("%s",&b);
        p=index(a,b);
        printf("The search char is:%c\n",*p);
}

但运行出现:Segmentation fault (core dumped)
通过gdb调试发现出错的是printf语句,取出*l的数值时出错,推理应该是上一语句p=index(a,b);执行时P指针变量没有得到正确的赋值。

后来发现只要把char a[10];和char b; 顺序对调就正常运行。。百思不得其解。。望DX指点。。


===>>scanf("%s",&b);
以%s格式化,实际b只存了第一个字符,后面的将覆盖b的高地址,也就是你上面声明的a,所以a的内容会改变(红字部分避免了这个情况,但隐患更大)。

===>>p=index(a,b);
当a的内容已经不是你输入的内容时,你这个函数有可能返回NULL,而你在没有判断返回值的情况下就开始处理(这里是打印),core dumped的结果已经是很给你面子了!

论坛徽章:
1
天蝎座
日期:2013-08-25 10:27:22
4 [报告]
发表于 2009-03-12 11:30 |只看该作者

回复 #3 乱.码 的帖子

scanf("%s",&b);应该是把单个字符当成字符串了,
例如,输入'c',却变成"c" -> 'c' 和 '\0';

char a[10];
char b;
这个顺序时,b的'c',并把a[0]弄成'\0',a成空串了。
p=index(a,b);
index返回null。



char b;
char a[10];
这个顺序时,b附带的'\0',没有影响到a(但是影响了其他的,只是没影响LZ肉眼看到的输出),并且b得到了'c'。
index()正常。(这个正常假设的前提是a串中有'c')



ps:相似情况,
http://bbs3.chinaunix.net/thread-1307764-1-1.html
3楼的tyc611 有图解。

论坛徽章:
0
5 [报告]
发表于 2009-03-12 17:49 |只看该作者
原帖由 乱.码 于 2009-3-12 10:13 发表


===>>scanf("%s",&b);
以%s格式化,实际b只存了第一个字符,后面的将覆盖b的高地址,也就是你上面声明的a,所以a的内容会改变(红字部分避免了这个情况,但隐患更大)。

===>>p=index(a,b);
当a的内容 ...


解析很正确a的首位的确是被b的结束符\0覆盖了,更改了定义的顺序b的结束符号接不会把a的首位字符覆盖了,但如果修改为scanf("%c",&b);程序执行到输入完字符串a之后就出错了
代码如下:
#include <string.h>
#include <stdio.h>
main()
{
        char *p;
        char a[10];
        char b;
        printf("Enter a string:\n");
        scanf("%s",a);
        printf("Enter a char for search:\n");
        scanf("%c",&b);
        p=index(a,b);
        printf("The search char is:%c\n",*p);
}

运行的情况:
Enter a string:
ppppp
Enter a char for search:
Segmentation fault (core dumped)

原来我写的时候也是scanf("%c",&b); 那时候出错了。后来修改了很多的东西去试最后忘记了把scanf("%s",&b); 改过来反而可以正常的执行了
现在不知道是什么原因?还望指点。

论坛徽章:
0
6 [报告]
发表于 2009-03-12 18:06 |只看该作者
原帖由 yangsf5 于 2009-3-12 11:30 发表
scanf("%s",&b);应该是把单个字符当成字符串了,
例如,输入'c',却变成"c" -> 'c' 和 '\0';

char a[10];
char b;
这个顺序时,b的'c',并把a[0]弄成'\0',a成空串了。
p=index(a,b);
index返回null。 ...



分析得很清晰,我写段输出地址的代码查看了变量的地址,的确是这样a的首位的确是被b的结束符\0覆盖了。更改了定义的顺序b的结束符号接不会把a的首位字符覆盖了。

代码如下:

#include <string.h>
#include <stdio.h>
main()
{
char *p;
int i=0;
char a[10];
char b;
printf("point p address:%x//%d\n",&p,&p);
printf("string a address:%x//%d\n",&a,&a);
printf("char b address:%x//%d\n",&b,&b);
printf("Enter a string:\n";
scanf("%s",a);
printf("Enter a char for search:\n";
scanf("%s",&b);
while(i<10)
{
printf("a[%d]:%c\n",i,a);
printf("a[%d] address is:%x//%d\n",i,&a,&a);
i++;
}
p=index(a,b);
printf("The search char is:%c\n",*p);
}

运行:
point p address:bfbffbdc//-1077937188
string a address:bfbffbcc//-1077937204
char b address:bfbffbcb//-1077937205
Enter a string:
qwertasdf
Enter a char for search:
f
a[0]:
a[0] address is:bfbffbcc//-1077937204

a[1]:w
a[1] address is:bfbffbcd//-1077937203
a[2]:e
a[2] address is:bfbffbce//-1077937202
a[3]:r
a[3] address is:bfbffbcf//-1077937201
a[4]:t
a[4] address is:bfbffbd0//-1077937200
a[5]:a
a[5] address is:bfbffbd1//-1077937199
a[6]:s
a[6] address is:bfbffbd2//-1077937198
a[7]:d
a[7] address is:bfbffbd3//-1077937197
a[8]:f
a[8] address is:bfbffbd4//-1077937196
a[9]:
a[9] address is:bfbffbd5//-1077937195
Segmentation fault (core dumped)

的确是a的首位被覆盖了。
但修改了scanf("%c",&b);之后还是不能正常运行:

代码如下:
#include <string.h>
#include <stdio.h>
main()
{
        char *p;
        char a[10];
        char b;
        printf("Enter a string:\n";
        scanf("%s",a);
        printf("Enter a char for search:\n";
        scanf("%c",&b);
        p=index(a,b);
        printf("The search char is:%c\n",*p);
}

运行的情况:
Enter a string:
ppppp
Enter a char for search:
Segmentation fault (core dumped)

程序执行到输入完字符串a之后就出错了.... 请指点指点。


[ 本帖最后由 BSDUP 于 2009-3-12 18:08 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2009-03-12 19:58 |只看该作者
printf("Enter a char for search:\n")  ;
       //scanf 这里读取的是 回车符号,  b = 0x0A
        scanf("%c",&b);
       // p = index(a, 0x0A), p 返回0
        p=index(a,b);
       // printf (*0)  -> core dump
        printf("The search char is:%c\n",*p);

       最后一句的printf,你应该要检查一下
      if(!p)
             printf("The search char is :%c\n", *p)
      else
            printf ("b :0x%x no in a: %s\n", b, a)

论坛徽章:
1
天蝎座
日期:2013-08-25 10:27:22
8 [报告]
发表于 2009-03-12 20:01 |只看该作者
scanf("%s",a);
这句下面加句getchar();来吸收你输入ppppp并回车时产生的换行符'\n'


p=index(a,b);
你这句也是不保险的,如果在a串里找不到b字符,会返回NULL
当p为NULL时,你*p就会段错误。
所以最后一句加个条件:

  1. if(p != NULL)
  2.     printf("The search char is:%c\n",*p);
  3. else
  4.     printf("no records.");
复制代码

论坛徽章:
0
9 [报告]
发表于 2009-03-13 02:06 |只看该作者
原帖由 yangsf5 于 2009-3-12 20:01 发表
scanf("%s",a);
这句下面加句getchar();来吸收你输入ppppp并回车时产生的换行符'\n'


p=index(a,b);
你这句也是不保险的,如果在a串里找不到b字符,会返回NULL
当p为NULL时,你*p就会段错误。
所以最后 ...




高手。。分析正确。。问题已解决。。谢谢

还想问问为什么scanf("%s",a);的回车符号会被下面的scanf("%c",b);所接收呢?我以后写类似的scanf的时候都要用getchar();来吸收回车符号吗?

论坛徽章:
0
10 [报告]
发表于 2009-03-13 02:11 |只看该作者
原帖由 yunccll 于 2009-3-12 19:58 发表
printf("Enter a char for search:\n")  ;
       //scanf 这里读取的是 回车符号,  b = 0x0A
        scanf("%c",&b);
       // p = index(a, 0x0A), p 返回0
        p=index(a,b);
       // printf  ...



scanf("%c",b);读取到的是回车符号。和楼下的解析都是正确的。谢谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP