读书人

C编程求纠错运行总是不对有漏洞

发布时间: 2012-03-20 14:01:11 作者: rapoo

C编程求纠错,运行总是不对,有漏洞,求大神帮助~~
题目:
编写一个函数string_in(),它接受两个字符串指针参数。如果第二个字符串被包含在第一个字符
串中,函数就返回被包含的字符串开始的地址。例如,string_in("hats", "at")返回hats中a的地址,否
则,函数返回空指针。在一个使用循环语句为这个函数提供输入的完整程序中进行测试。
我做的string_int()
char * string_in(char * p1, char * p2)
{
int i =0;
int j;

if(*p2 =='\0')
return NULL;
while(*(p1 +i) !='\0')
{
if(*(p1 +i) ==*p2)
{
for(j =1; *(p2 +j) !=*(p1 +i +j); j++)
continue;
if(*(p2 +j) =='\0')
return (p1+ i);
else
i++;
}
else
i++;
}
return NULL;
}
看到答案的string_in()
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;
}
}
}
运行的main()
int main(void)
{
char str1[81];
char str2[81];
char * p;

puts("Input first string:");
gets(str1);
do{
puts("Input find string:");
gets(str2);
p =string_in(str1, str2);
if(p)
{
puts("Find!");
puts(p);
}
else
puts("Can't find!");
puts("Input first string (q to quit):");
gets(str1);
}while(*str1 !='q');

return 0;
}
我写的运行时查找的总是有些问题,想了半天感觉答案所涉及到的条件,和调用都有了可还是没和答案一样。
求大神帮助

[解决办法]

C/C++ code
#include <stdio.h>char * string_in(char * p1, char * p2){    int i =0;    int j;    if(*p2 =='\0')    {        return NULL;    }    while(*(p1 +i) !='\0')    {        if(*(p1 +i) ==*p2)        {            for(j =1; *(p2 +j) ==*(p1 +i +j); j++)    //这里你写成!=了            {                continue;            }            if(*(p2 +j) =='\0')            {                return (p1+i);                    }            else            {                i++;            }        }        else        {            i++;        }    }    return NULL;}//看到答案的string_in()/*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;  } }}*///运行的main()int main(void){    char str1[81];    char str2[81];    char * p;    puts("Input first string:");    gets(str1);    do    {        puts("Input find string:");        gets(str2);        p =string_in(str1, str2);        if(p)        {            puts("Find!");            puts(p);        }        else        {                puts("Can't find!");        }        puts("Input first string (q to quit):");        gets(str1);    } while(*str1 !='q');    return 0;}
[解决办法]
strstr,完事儿了
[解决办法]
for(j =1; *(p2 +j) != *(p1 +i +j); j++)
改为

for(j =1; *(p2 +j) == *(p1 +i +j); j++)
[解决办法]
#include <cruntime.h>
#include <string.h>

/***
*char *strstr(string1, string2) - search for string2 in string1
*
*Purpose:
* finds the first occurrence of string2 in string1
*
*Entry:
* char *string1 - string to search in


* char *string2 - string to search for
*
*Exit:
* returns a pointer to the first occurrence of string2 in
* string1, or NULL if string2 does not occur in string1
*
*Uses:
*
*Exceptions:
*
*******************************************************************************/

char * __cdecl strstr (
const char * str1,
const char * str2
)
{
char *cp = (char *) str1;
char *s1, *s2;

if ( !*str2 )
return((char *)str1);

while (*cp)
{
s1 = cp;
s2 = (char *) str2;

while ( *s1 && *s2 && !(*s1-*s2) )
s1++, s2++;

if (!*s2)
return(cp);

cp++;
}

return(NULL);

}

[解决办法]
话说还是C库实现得简洁有力啊:

C/C++ code
Wchar *Wstrstr(const Wchar *s1, const Wchar *s2){    register const Wchar *s = s1;    register const Wchar *p = s2;    do {        if (!*p) {            return (Wchar *) s1;;        }        if (*p == *s) {            ++p;            ++s;        } else {            p = s2;            if (!*s) {                return NULL;            }            s = ++s1;        }    } while (1);} 

读书人网 >C语言

热点推荐