user-0 提问: 求字符串中的查找子串

回复:
user: user-0
content: 引用 5 楼 其实一开始我是拒绝的的回复:[quote=引用 4 楼 自信男孩的回复:]#include <stdio.h> #include <string.h> //#include "stdio.h" //#include "string.h" //#if 0 #define N 10  struct Book {   char name[100];     float price; };  int instring(const char *s1, const char *s2); //s1若属于s2的字串，则返回1，否则返回0 int main() {   struct Book books[N]={{"Fling in sky",23.0},{"I love my mother",15.5},{"My love",25.6},{"Color is red",34.9},{"Black and red",20.5},{"Let me love you",16.0}, {"Sun is red",45.0},{"Flower sunshine",23.8},{"Say love not easy",45.9},{"Friday black",34.0}};     int i;     char name[20];     gets(name);     for(i=0;i<N;i++)         if(instring(name,books[i].name))             printf("%30s,%6.2f\n",books[i].name,books[i].price);     return 0; }  int instring(const char *s1, const char *s2) {     if (strstr(s2, s1))         return 1;     return 0;  } //#else  int instring2(const char *s1, const char *s2) {     int i = 0;     int len1, len2;      len1 = strlen(s1);     len2 = strlen(s2);      while (i < len2) {         if (len2 - i < len1)             break;         if (strncmp(s1, s2+i, len1) == 0)             return 1;         i++;     }      return 0; } /* int main(void) {     const char *s1 = "helloworld";     const char *s2 = "orl";      printf("%d\n", instring2(s2, s1));      return 0; } */ #endif 供参考～  两种方法都可以考虑测试一下。 能解释一下第二种方法？[/quote] 我搞懂了，谢谢。

user: user-0
content: 引用 4 楼 自信男孩的回复:#include <stdio.h> #include <string.h> //#include "stdio.h" //#include "string.h" //#if 0 #define N 10  struct Book {   char name[100];     float price; };  int instring(const char *s1, const char *s2); //s1若属于s2的字串，则返回1，否则返回0 int main() {   struct Book books[N]={{"Fling in sky",23.0},{"I love my mother",15.5},{"My love",25.6},{"Color is red",34.9},{"Black and red",20.5},{"Let me love you",16.0}, {"Sun is red",45.0},{"Flower sunshine",23.8},{"Say love not easy",45.9},{"Friday black",34.0}};     int i;     char name[20];     gets(name);     for(i=0;i<N;i++)         if(instring(name,books[i].name))             printf("%30s,%6.2f\n",books[i].name,books[i].price);     return 0; }  int instring(const char *s1, const char *s2) {     if (strstr(s2, s1))         return 1;     return 0;  } //#else  int instring2(const char *s1, const char *s2) {     int i = 0;     int len1, len2;      len1 = strlen(s1);     len2 = strlen(s2);      while (i < len2) {         if (len2 - i < len1)             break;         if (strncmp(s1, s2+i, len1) == 0)             return 1;         i++;     }      return 0; } /* int main(void) {     const char *s1 = "helloworld";     const char *s2 = "orl";      printf("%d\n", instring2(s2, s1));      return 0; } */ #endif 供参考～  两种方法都可以考虑测试一下。 能解释一下第二种方法？

user: user-1
content: #include <stdio.h> #include <string.h> //#include "stdio.h" //#include "string.h" //#if 0 #define N 10  struct Book {   char name[100];     float price; };  int instring(const char *s1, const char *s2); //s1若属于s2的字串，则返回1，否则返回0 int main() {   struct Book books[N]={{"Fling in sky",23.0},{"I love my mother",15.5},{"My love",25.6},{"Color is red",34.9},{"Black and red",20.5},{"Let me love you",16.0}, {"Sun is red",45.0},{"Flower sunshine",23.8},{"Say love not easy",45.9},{"Friday black",34.0}};     int i;     char name[20];     gets(name);     for(i=0;i<N;i++)         if(instring(name,books[i].name))             printf("%30s,%6.2f\n",books[i].name,books[i].price);     return 0; }  int instring(const char *s1, const char *s2) {     if (strstr(s2, s1))         return 1;     return 0;  } //#else  int instring2(const char *s1, const char *s2) {     int i = 0;     int len1, len2;      len1 = strlen(s1);     len2 = strlen(s2);      while (i < len2) {         if (len2 - i < len1)             break;         if (strncmp(s1, s2+i, len1) == 0)             return 1;         i++;     }      return 0; } /* int main(void) {     const char *s1 = "helloworld";     const char *s2 = "orl";      printf("%d\n", instring2(s2, s1));      return 0; } */ #endif 供参考～  两种方法都可以考虑测试一下。

user: user-0
content: 引用 2 楼 其实一开始我是拒绝的的回复:[quote=引用 1 楼 自信男孩的回复:]直接贴代码吧，贴图片不好给你调试代码～ #include "stdio.h" #include "string.h" #define N 10 struct Book {   char name[100];     float price; }; int instring(char *s1,char *s2); //s1若属于s2的字串，则返回1，否则返回0 int main() {   struct Book books[N]={{"Fling in sky",23.0},{"I love my mother",15.5},{"My love",25.6},{"Color is red",34.9},{"Black and red",20.5},{"Let me love you",16.0}, {"Sun is red",45.0},{"Flower sunshine",23.8},{"Say love not easy",45.9},{"Friday black",34.0}};     int i;     char name[20];     gets(name);     for(i=0;i<N;i++)         if(instring(name,books[i].name))            printf("%30s,%6.2f\n",books[i].name,books[i].price);     return 0; }  int instring(char *s1,char *s2) {     [textArea=11,60] } [/quote] 怎样在函数定义那里实现？

user: user-0
content: 引用 1 楼 自信男孩的回复:直接贴代码吧，贴图片不好给你调试代码～ #include "stdio.h" #include "string.h" #define N 10 struct Book {   char name[100];     float price; }; int instring(char *s1,char *s2); //s1若属于s2的字串，则返回1，否则返回0 int main() {   struct Book books[N]={{"Fling in sky",23.0},{"I love my mother",15.5},{"My love",25.6},{"Color is red",34.9},{"Black and red",20.5},{"Let me love you",16.0}, {"Sun is red",45.0},{"Flower sunshine",23.8},{"Say love not easy",45.9},{"Friday black",34.0}};     int i;     char name[20];     gets(name);     for(i=0;i<N;i++)         if(instring(name,books[i].name))            printf("%30s,%6.2f\n",books[i].name,books[i].price);     return 0; }  int instring(char *s1,char *s2) {     [textArea=11,60] }

user: user-1
content: 直接贴代码吧，贴图片不好给你调试代码～

user: user-2
content: 引用 10 楼 其实一开始我是拒绝的 的回复:for的后面为什么有分号 因为for不需要做什么处理，只需要找到不符合循环条件的 j 位置，如果找不到 j 位置（也就是一直满足 for 循环条件），j 就会一直走到s1的最后位置（也就是 j 一直走到 s1 的最后字符都是和 s2 的字符相等的），所以此时就说明s2里包含s1，所以后面的接着的 if 就直接返回 1

user: user-0
content: 引用 8 楼 其实一开始我是拒绝的的回复:[quote=引用 7 楼 user-2的回复:][quote=引用 5 楼 其实一开始我是拒绝的 的回复:]  能解释一下第二种方法？ 方法二的另一种形式，可能更好理解一些（其实就挨个比较字符，只不过LS用了内存比较） int instring2(char *s1, char *s2) {     int i=0,j=0;     for(;s2[i]!='\0'; i++)      {         if (s2[i]==s1[0]) //找到第一个相等的字符后         {              for (j=1;s2[i+j]!='\0'&&s1[j]!='\0'&&s2[i+j]==s1[j];j++); //依次比较后续的字符             if (s1[j]=='\0') return 1; //如果后续字符都相同就返回1         }     }     return 0; }[/quote] 为什么for后面会有（）[/quote] for的后面为什么有分号

user: user-0
content: 引用 8 楼 其实一开始我是拒绝的的回复:[quote=引用 7 楼 user-2的回复:][quote=引用 5 楼 其实一开始我是拒绝的 的回复:]  能解释一下第二种方法？ 方法二的另一种形式，可能更好理解一些（其实就挨个比较字符，只不过LS用了内存比较） int instring2(char *s1, char *s2) {     int i=0,j=0;     for(;s2[i]!='\0'; i++)      {         if (s2[i]==s1[0]) //找到第一个相等的字符后         {              for (j=1;s2[i+j]!='\0'&&s1[j]!='\0'&&s2[i+j]==s1[j];j++); //依次比较后续的字符             if (s1[j]=='\0') return 1; //如果后续字符都相同就返回1         }     }     return 0; }[/quote] 为什么for后面会有（）[/quote] for的后面为什么有；

user: user-0
content: 引用 7 楼 user-2的回复:[quote=引用 5 楼 其实一开始我是拒绝的 的回复:]  能解释一下第二种方法？ 方法二的另一种形式，可能更好理解一些（其实就挨个比较字符，只不过LS用了内存比较） int instring2(char *s1, char *s2) {     int i=0,j=0;     for(;s2[i]!='\0'; i++)      {         if (s2[i]==s1[0]) //找到第一个相等的字符后         {              for (j=1;s2[i+j]!='\0'&&s1[j]!='\0'&&s2[i+j]==s1[j];j++); //依次比较后续的字符             if (s1[j]=='\0') return 1; //如果后续字符都相同就返回1         }     }     return 0; }[/quote] 为什么for后面会有（）

user: user-2
content: 引用 5 楼 其实一开始我是拒绝的 的回复:能解释一下第二种方法？ 方法二的另一种形式，可能更好理解一些（其实就挨个比较字符，只不过LS用了内存比较） int instring2(char *s1, char *s2) {     int i=0,j=0;     for(;s2[i]!='\0'; i++)      {         if (s2[i]==s1[0]) //找到第一个相等的字符后         {              for (j=1;s2[i+j]!='\0'&&s1[j]!='\0'&&s2[i+j]==s1[j];j++); //依次比较后续的字符             if (s1[j]=='\0') return 1; //如果后续字符都相同就返回1         }     }     return 0; }