这个程序为什么会出现段错误

泡泡 2010-09-21 04:03:42

#include <stdio.h>

char *fine_char(char const *source,char const *chars)
{
char *source_find=source;
char *chars_find=chars;
for( ;*source_find!='\0';source_find++)
{
for(;*chars_find!='\0';chars_find++)
{
if(*chars_find==*source_find)
return chars_find;
}
}
return 0;
}

int main()
{
char *a ="hello";
char *b ="e";
printf("%s\n",fine_char(a,b));
}


查找source字符串中匹配chars字符串中任何字符的第一个字符
为什么会出现段错误?
环境:linux gcc
...全文
149 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
operatingtuzi 2010-09-21
  • 打赏
  • 举报
回复
char *source_find=source;
char *chars_find=chars;
for( ;*source_find!='\0';source_find++)
{
for(;*chars_find!='\0';chars_find++)

还有 你的内层循环一旦是\0 就不在更新 外层就只和\0比较了
operatingtuzi 2010-09-21
  • 打赏
  • 举报
回复
char *fine_char(char const *source,char const *chars)
{
char *source_find=source;
char *chars_find=chars;


这样很明显会有编译错误啊
思远作细 2010-09-21
  • 打赏
  • 举报
回复
按照你的写法,fine_char(a,b)返回的是NULL, 在VC下面不会段错误,打印的是"(null)"
思远作细 2010-09-21
  • 打赏
  • 举报
回复
我的说错了,虽然是常量,但是和段错误无关
你的程序满足不了你的意图,
for( ;*source_find!='\0';source_find++)
{
for(;*chars_find!='\0';chars_find++)
{
if(*chars_find==*source_find)
return chars_find;
}
}

在内循环循环一次以后,*chars_find!='\0'就会一直不成立了
应该在内层FOR循环之前,加上 char *chars_find=chars;
mao_pu_hua 2010-09-21
  • 打赏
  • 举报
回复
找个程序是在你第二次循环的时候,没有初始化
for(chars_find = chars;*chars_find!='\0';chars_find++)
加上第一个条件就ok了
evoloyeu 2010-09-21
  • 打赏
  • 举报
回复
应该改为这样:
char *fine_char(char const *source,char const *chars)
{
char *source_find=source;
char *chars_find = NULL;
for( ;*source_find!='\0';source_find++)
{
if((chars_find = strstr(source_find,chars))!=NULL)
return chars_find;
}
return 0;
}

int main()
{
char *a ="hello";
char *b ="e";
printf("%s\n",fine_char(a,b));
}
evoloyeu 2010-09-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 haoge198812 的回复:]
C/C++ code

#include <stdio.h>

char *fine_char(char const *source,char const *chars)
{
char *source_find=source;
char *chars_find=chars;
for( ;*source_find!='\0';source_find++)
{
……
[/Quote]
问题出在这里:
for(;*chars_find!='\0';chars_find++)
蓝色部分最后让chars_find为空了。
当然最后打印的时候就出现断错误了。
luciferisnotsatan 2010-09-21
  • 打赏
  • 举报
回复
建议用gdb调一下,就算不调,那gdb run一下,也能报告在哪里出错了。
熊熊大叔 2010-09-21
  • 打赏
  • 举报
回复
内循环每次都要初始化的,现在结果是执行了
printf("%s\n", 0); 当然出段错误了
luciferisnotsatan 2010-09-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 luciferisnotsatan 的回复:]

lz直接用strchr函数不就可以了。
另外,如果没有找到,你返回0,就是NULL。你把一个指向NULL的指针传给printf了
[/Quote]
应该用strstr,这个找字符串
strchr找一个字符
hai040 2010-09-21
  • 打赏
  • 举报
回复
第2个for变量要初始化
应该是return source...

段错误可能是返回0?
Bizet 2010-09-21
  • 打赏
  • 举报
回复
看错了 是不是const指针传递给非const的问题?
思远作细 2010-09-21
  • 打赏
  • 举报
回复
"char * a = "hello""
这种叫做字面值常量,所以你的函数非法的访问了内存。
改成char a[8] = "hello"; char b[4] = "e";
luciferisnotsatan 2010-09-21
  • 打赏
  • 举报
回复
lz直接用strchr函数不就可以了。
另外,如果没有找到,你返回0,就是NULL。你把一个指向NULL的指针传给printf了
Bizet 2010-09-21
  • 打赏
  • 举报
回复
%c吧

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧