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);}