首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

编写一个函数string_in(char *str1,char *str2),如果字符串str1包含字符串str2,则返回数值1,否则返回数值2,内存提示出错啊

2012-03-15 
编写一个函数string_in(char *str1,char *str2),如果字符串str1包含字符串str2,则返回数值1,否则返回数值2

编写一个函数string_in(char *str1,char *str2),如果字符串str1包含字符串str2,则返回数值1,否则返回数值2,内存提示出错啊
//编写一个函数string_in(char *str1,char *str2),如果字符串str1包含字符串str2,则返回数值1,否则返回数值2,还是内存提示出错啊
#include"stdio.h"
#include"string.h"
  int string_in(char* str1,char* str2){
  int p,l2;
  l2=strlen(str2); //把字符串2的长度赋给l2
if(*str2) // s2 第一个字符不是空 进行下面的操作
  while(*str1) // s1 不是结束符作为循环条件
  {if(*str1==*str2) //字符串1和字符串2第一个字符相比,如果相等,做下面的运算
  {
  for(p=0;*(str1+p)==*(str2+p);p++) //s1 s2 从第一个字符开始比较并同时往下移一个字符
  {while(p>=(l2-1)) //当p自增到把s2跑完的时候,则表示字符串1包含字符串2
  return 1; //返回1
  }
   
  }
  else if(*str1!=='\n') str1++; //str1自增,使其找到与str2字符串首字符的字符。  
  else return 2 ; //当str1自增到结束的时候,他里面都没有字符串与str1相等,那就返回2

  }
  }
int main(){
  char* str1;
  char* str2;
  int flag=1,a;
  while(flag==1){
  printf("imput string1 :\n");
  gets(str1);
  printf("imput string2 :\n");
  gets(str2);
  if(strlen(str1)<strlen(str2))
  {flag=1;
  printf("字符串1比字符串2多才对!");}
  else flag=0;
  }
  a=string_in(str1,str2);
  printf("%d",a);
   


}



[解决办法]
没看到你申请为str1 str2申请空间;

char* str1=new char[100];
char* str2=new char[100];

memset(str1,0,100);
memset(str2,0,100);

最后记得delete




[解决办法]
自己调试吧,崩溃肯定是地址访问错了,看看指针是否越界了
[解决办法]

C/C++ code
#include <stdio.h>#include <malloc.h>#include <string.h>void getNextval(char *subStr, int *nextval, int length){    int i = 0, j = -1;    nextval[0] = -1;    while(i < length - 1)    {                if(j <= 0 || subStr[i] == subStr[j])        {            ++i;            ++j;            if(subStr[i] != subStr[j])                nextval[i] = j;            else                nextval[i] = nextval[j];        }        else            j = nextval[j];    }}int kmp(char *str, char *subStr){    int strLen = strlen(str);    int subStrLen = strlen(subStr);    int *nextval = (int*)malloc(sizeof(int)*subStrLen);    int i = -1, j = -1;    getNextval(subStr, nextval, subStrLen);    while(i < strLen && j < subStrLen)    {        if(j < 0 || str[i] == subStr[j])        {            ++i;            ++j;        }        else             j = nextval[j];            }    free(nextval);    if(j >= subStrLen)        return i - subStrLen;    return -1;}int main(){    char str[] = "acabaabaabcacaabc";    char subStr[] = "abaab";    //printf("\n%d\n", kmp(str, subStr));    if(kmp(str, subStr) == -1)        printf("2\n");    else        printf("1\n");    return 0;}
[解决办法]
首先
C/C++ code
    char str1[128] = {0};    char str2[128] = {0};
[解决办法]
C/C++ code
#include <string.h>int string_in(char *str1,char *str2) {  if (strstr(str1,str2)) return 1; else return 2;}
------解决方案--------------------


改完记得可用kmp算法做个改进
[解决办法]
string_in(char *str1,char *str2)
{
CString str = (CString)str1;
if(str.Find(str2)) return 1;
else return 2;
}
[解决办法]

探讨

C/C++ code
#include <string.h>
int string_in(char *str1,char *str2) {
if (strstr(str1,str2)) return 1; else return 2;
}

[解决办法]
探讨

我想问下,指针没有分配空间,另外我问了些其他论坛,也有人是说没分配空间
#i……

[解决办法]
探讨
引用:
没看到你申请为str1 str2申请空间;

char* str1=new char[100];
char* str2=new char[100];

memset(str1,0,100);
memset(str2,0,100);

最后记得delete

我想问下,指针没有分配空间,另外我问了些其他论坛,也有人是说没分配空间
#in……

[解决办法]
C/C++ code
    int p,l2,i=0;    l2=strlen(str2);     if(*str2)         while(*(str1+i)!='\0')         {            if(*(str1+i)==*str2)             {
[解决办法]
你的代码有几处错误,改动如下:
C/C++ code
#include"stdio.h"#include"string.h"int string_in(char* str1,char* str2){    int p,l2;    l2=strlen(str2); //把字符串2的长度赋给l2    if(*str2) // s2 第一个字符不是空 进行下面的操作    {        while(*str1) // s1 不是结束符作为循环条件        {            if(*str1==*str2) //字符串1和字符串2第一个字符相比,如果相等,做下面的运算            {                for(p=0;*(str1+p)==*(str2+p);p++) //s1 s2 从第一个字符开始比较并同时往下移一个字符                {                    if(p>=(l2-1)) //[color=#FF0000]这个地方应该是if吧?[/color]                    return 1; //返回1                }                            }            else if(*str1 !='\n') str1++; //str1自增,使其找到与str2字符串首字符的字符。               else return 2 ; //当str1自增到结束的时候,他里面都没有字符串与str1相等,那就返回2                    }    }    return 2;//[color=#FF0000]要加上这句,否则这个执行路径没有返回值,会返回不确定的值[/color]}void main(){//[color=#FF0000]main函数要么返回类型为void,要么你在最后也要返回一个值[/color]    char* str1 = new char[100] ;//[color=#FF0000]根据1楼提示[/color]    char* str2 = new char[100];    int flag=1,a;    while(flag==1){        printf("imput string1 :\n");        gets(str1);        printf("imput string2 :\n");        gets(str2);        if(strlen(str1)<strlen(str2))        {flag=1;        printf("字符串1比字符串2多才对!");}        else flag=0;    }    a=string_in(str1,str2);    delete str1;[color=#FF0000]//根据1楼的提示delete[/color]    delete str2;    printf("%d",a);}
[解决办法]
C/C++ code
for(p=0;*(str1+i+p)==*(str2+p);p++)                 {                    if(p>=(l2-1))                        return 1;                 }                i++;            }            else                i++;         }    return 2;
[解决办法]
晕死。上面想把注释字体颜色用红色表示的,又没搞好

热点排行