???OY 2015-10-19 06:56 采纳率: 44.4%
浏览 1635
已采纳

我编的这个函数为什么没能实现功能?

7.编写一个函数string_in(),它接受两个字符串指针参数。如果第二个字符串被包含在第一个字符串中,函数就返回被包含的字符开始的地址。例如,string_in("hats","at")返回hats中a的地址,则,函数返回空指针。在一个使用循环语句为这个函数提供输入的完整程序中进行测试。
char string_in(char *p1,char *p2){
int m = 0;
int i;
char *p3 = p2;
char *p4;
while(*p1 != *p2)
++p1;
p4 = p1;
while(*p3 != '\0'){
p3++;
m++;
}
for(i = 0;i < m;i++){
if(
++p1 != *++p2)
return NULL;

}
return p4;

}
正确答案:
char string_in(char *p1,char *p2)
{
char *p1_save = p1, *p2_save = p2;
if(*p1 == '\0' || *p2 == '\0') return NULL;
while(1)
{
if(*p1 == *p2)
{
if(
++p2 == '\0') return p1_save;
if(*++p1 == '\0') return NULL;
}
else
{
if(*++p1 == '\0') return NULL;
p1_save = p1;
p2 = p2_save;
}
}
}
我感觉有点想不到?还有其他方法吗?

  • 写回答

4条回答 默认 最新

  • Jo_huang 2015-10-19 07:35
    关注

    char* string_in(char *p1,char *p2)
    {
    for(int i=0;p1[i]!='\0';i++)
    {
    if(p1[i]==p2[0])
    {
    int j=1;
    for(;p2[j]!='\0';j++)
    {
    if(p2[j]!=p1[i+j]) break;
    }
    if(p2[j]=='\0') return &(p1[i]);//如果p2已经遍历到了结尾,说明全部字符匹配
    }

    }
    return NULL;
    

    }

    
    

    首先,你的方法里面用while计算出m作为for循环的计数值,这是没有必要的,直接判断是否到达结尾'\0'就行了,另外,返回的应该是char *,而不是char.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 宇视监控服务器无法登录
  • ¥15 PADS Logic 原理图
  • ¥15 PADS Logic 图标
  • ¥15 电脑和power bi环境都是英文如何将日期层次结构转换成英文
  • ¥20 气象站点数据求取中~
  • ¥15 如何获取APP内弹出的网址链接
  • ¥15 wifi 图标不见了 不知道怎么办 上不了网 变成小地球了
  • ¥50 STM32单片机传感器读取错误
  • ¥50 power BI 从Mysql服务器导入数据,但连接进去后显示表无数据
  • ¥15 (关键词-阻抗匹配,HFSS,RFID标签天线)