| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 466 人关注过本帖
标题:检测字符串
只看楼主 加入收藏
hexianqi1994
Rank: 1
等 级:新手上路
帖 子:50
专家分:0
注 册:2011-8-3
结帖率:86.96%
收藏
已结贴  问题点数:5 回复次数:9 
检测字符串
   7.编写一个函数string_in(),它接受两个字符串指针参数。如果第二个字符串被包含在第一个字符串中,函数就返回被包含的字符开始的地址。例如,string_in("hats","at")返回hats中a的地址,则,函数返回空指针。在一个使用循环语句为这个函数提供输入的完整程序中进行测试。

这串代码的主函数是答案的,所调用的函数是我写的,检测不到的时候能够正常显示,检测到时就出现内存错误,应该是红字问题,麻烦看一下,求详细.

#include <stdio.h>

char *string_in(char *p1, char *p2);

int main(void)
{
    char str1[81];
 char str2[21];
 char *p;
 do
 {
  puts("input range string:");
  gets(str1);
  puts("input match string:");
  gets(str2);
  p = string_in(str1, str2);
  if ( p )
  {
   puts("Find!");
   puts(p);
  }
  else puts("Can't find!");

  puts("input any char except q to go on.");
  gets(str1);
 }
 while(*str1 != 'q');

 puts("Quit.");
    return 0;
}

char *string_in(char *p1, char *p2)
{
    char *p;
    int i,count;
    while(*p1!='\0' && *p2!='\0')
    {
        if(*p2==*p1)
        {
            p2++;
            p1++;
            count++;
        }
        else
            p1++;
    }
    if(*p1=='\0'&& p2!='\0')
        p=NULL;
    else
    {
    for(i=0;i<count;i++)
    p2--;
    for(; *p1=*p2 ;p1--)
    p=p1;
    }
return p;
}
搜索更多相关主题的帖子: 字符串 
2011-08-22 11:17
hexianqi1994
Rank: 1
等 级:新手上路
帖 子:50
专家分:0
注 册:2011-8-3
收藏
得分:0 
在线等~~
2011-08-22 11:17
dreamofgod
Rank: 5Rank: 5
等 级:职业侠客
帖 子:194
专家分:341
注 册:2011-8-16
收藏
得分:5 
这里错掉了。
程序代码:
while(*p1!='\0' && *p2!='\0')
    {
        if(*p2==*p1)
        {
            p2++;//p2指向的字符在改变。
            p1++;
            count++;
        }
        else
            p1++;//p2的指向的字符被改变了,不再是从头开始对比。
    }

最后那不分算法太麻烦了点,可以改成我这样。
程序代码:
#include"stdio.h"
char *string_in(char *p1, char *p2);
int main(void)
{
    char str1[81];
    char str2[21];
    char *p;
    do
    {
          puts("input range string:");
          gets(str1);
          puts("input match string:");
          gets(str2);
          p = string_in(str1, str2);
          if ( p )
          {
               puts("Find!");
               puts(p);
          }
          else
          {
              puts("Can't find!");
          }
          puts("input any char except q to go on.");
          gets(str1);
    }
    while(*str1 != 'q');

    puts("Quit.");
    return 0;
}

char *string_in(char *p1, char *p2)
{
    char *p;
    int i=0,count=0;
    char *str1=p1,*str2=p2;
    while(*str1!='\0' && *str2!='\0')
    {
        if(*str1==*str2)
        {
            str1++;str2++;
            count++;
        }
        else
        {
            str1++;
            p1++;
            str2=p2;
        }
    }
    if(*str1=='\0'&& str2!='\0')
    {
        p=NULL;
    }
    else
    {
        p=p1;
    }
    return p;
}

一个单片机就让我头疼不已~~~
2011-08-22 12:31
hexianqi1994
Rank: 1
等 级:新手上路
帖 子:50
专家分:0
注 册:2011-8-3
收藏
得分:0 
回复 3楼 dreamofgod
p2字符改变是在*p2==*p1时才改变呀和,*p2!=*p1的情况下的语句有关吗?
2011-08-22 12:38
hexianqi1994
Rank: 1
等 级:新手上路
帖 子:50
专家分:0
注 册:2011-8-3
收藏
得分:0 
回复 3楼 dreamofgod
还有,已经把p1的值赋给了str1,为什么后来还要p1++
2011-08-22 12:42
hexianqi1994
Rank: 1
等 级:新手上路
帖 子:50
专家分:0
注 册:2011-8-3
收藏
得分:0 
回复 3楼 dreamofgod
刚试过你的函数,如果字符串2是字符串1的最后一个字母好像检测不到哦
2011-08-22 12:44
饭桶
Rank: 6Rank: 6
等 级:侠之大者
帖 子:165
专家分:422
注 册:2011-4-5
收藏
得分:0 
回复 3楼 dreamofgod
程序代码:
#include"stdio.h"
char *string_in(char *p1, char *p2);
int main(void)
{
    char str1[81];
    char str2[21];
    char *p;
    do
    {
          puts("input range string:");
          gets(str1);
          puts("input match string:");
          gets(str2);
          p = string_in(str1, str2);
          if ( p )
          {
               puts("Find!");
               puts(p);
          }
          else
          {
              puts("Can't find!");
          }
          puts("input any char except q to go on.");
          gets(str1);
    }
    while(*str1 != 'q');

    puts("Quit.");
    return 0;
}

char *string_in(char *p1, char *p2)
{
    char *p;
    int i=0,count=0;
    char *str1=p1,*str2=p2;
    while(*str1!='\0' && *str2!='\0')
    {
        if(*str1==*str2)
        {
            str1++;str2++;
            count++;
        }
        else
        {
            str1=++p1;//也许这里应该改一下
            //p1=str1;
            str2=p2;
        }
    }
    if(*str1=='\0'&& str2!='\0')
    {
        p=NULL;
    }
    else
    {
        p=p1;
    }
    return p;
}

人得一生得奋斗!
2011-08-22 13:33
dreamofgod
Rank: 5Rank: 5
等 级:职业侠客
帖 子:194
专家分:341
注 册:2011-8-16
收藏
得分:0 
4楼:
p1="abccdefg";p2="cd"
这样的话,遇到第一个c就会进入if,p2指向了d,让后退出if遇到第二个c,此时p2还是指向着d,应该有个回头指向c的过程。
5楼:
str1和p1同步,对比时只用str1,这样就可以简化一下最后的回滚了。
6楼:
if(*str1=='\0'&& str2!='\0')
改为
if(*p1=='\0'&& str2!='\0')

一个单片机就让我头疼不已~~~
2011-08-22 14:21
wicky
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2011-8-22
收藏
得分:0 
回复 4楼 hexianqi1994
第一个字符相等之后并不能保证后面的字符也相等啊,所有如果不是全部的字符相等,每一次else时都要把p2指向原来的首地址
2011-08-22 21:44
wicky
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2011-8-22
收藏
得分:0 
//貌似就是一个字符串的子串的问题,如果边界处不加注意是很容易出错的
char *string_in(char *p1, char *p2)
{
    char *p;
    int i,count;
    char *start_p2;        //p2的首地址
    start_p2 = p2;
    count = strlen(p2);    //p2字符串的长度
    while(*p1!='\0' && *p2!='\0')
    {
        if(*p2==*p1)
        {
            p2++;
            p1++;
        }
        else
        {
            p1++;
            p2 = start_p2;// 将p2置到首地址
        }
    }
    if(((*p1=='\0')&&(p2=='\0'))||((*p1 == '\0')&&(*p2 !='\0')))
        p=NULL;
    else
    {
        for(i=0;i<count;i++)
        p1--;
        p = p1;
    }
    return p;
}
2011-08-22 21:49
快速回复:检测字符串
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023109 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved