user-0 提问: 查找字符串子串用strcmp函数

回复:
user: user-1
content: 学习。。。。。。。

user: user-2
content: int instring(char *s1, char *s2) {   if (!strlen(s1) > strlen(s2)) return 0;   char *cur_s1 = s1;   char *cur_s2 = s2;   if (*cur_s1 == '\0') return 1;   else return 0;   if (*cur_s1 == *cur_s2) return instring(cur_s1++, cur_s2++); }

user: user-0
content: 引用 23 楼 qybao的回复:[quote=引用 22 楼 其实一开始我是拒绝的 的回复:]  不用动态分配，直接char*s【20】=NULL可以？ 就你的代码而言，s1肯定不会超过20（name[20]），所以不用动态分配，用char s[20] = {0}; 也可以，这样连s[len1]='\0'也可以省了[/quote] 好，，，，，，，

user: user-3
content: 引用 22 楼 其实一开始我是拒绝的 的回复:不用动态分配，直接char*s【20】=NULL可以？ 就你的代码而言，s1肯定不会超过20（name[20]），所以不用动态分配，用char s[20] = {0}; 也可以，这样连s[len1]='\0'也可以省了

user: user-0
content: 引用 21 楼 qybao的回复:[quote=引用 20 楼 其实一开始我是拒绝的 的回复:]  为什么s【len1】要等于字符串结束符 因为s的最后一个字符是字符串结尾符，s申请内存的长度是len1+1就是为了让s的最后一个字符保存字符串结尾符，从s2循环赋值给s只用到len1个字符（从s[0]到s[len1-1]），所以最后一个字符就是s[len1][/quote] 不用动态分配，直接char*s【20】=NULL可以？

user: user-3
content: 引用 20 楼 其实一开始我是拒绝的 的回复:为什么s【len1】要等于字符串结束符 因为s的最后一个字符是字符串结尾符，s申请内存的长度是len1+1就是为了让s的最后一个字符保存字符串结尾符，从s2循环赋值给s只用到len1个字符（从s[0]到s[len1-1]），所以最后一个字符就是s[len1]

user: user-0
content: 引用 11 楼 qybao的回复:用strcmp的（不用memcpy的版本） int instring(char *s1,char *s2) {     int len1,i;     if(s1==NULL || s2==NULL) return 0;     len1 = (int)strlen(s1);     char *s = (char*)malloc(sizeof(char)*(len1+1)); //用个临时变量保存子串     s[len1] = '\0';     for(;*s2!='\0'&&strlen(s2)>=len1;s2++) //循环改变s2的开始位置     {         for (i=0;i<len1;i++) //用for循环从s2开始位置截取子串             s[i] = s2[i];         if (strcmp(s, s1) == 0) //如果截取的子串和s1相同             return 1;     }     free(s); //释放临时变量     return 0; } 为什么s【len1】要等于字符串结束符

user: user-0
content: 引用 11 楼 qybao的回复:用strcmp的（不用memcpy的版本） int instring(char *s1,char *s2) {     int len1,i;     if(s1==NULL || s2==NULL) return 0;     len1 = (int)strlen(s1);     char *s = (char*)malloc(sizeof(char)*(len1+1)); //用个临时变量保存子串     s[len1] = '\0';     for(;*s2!='\0'&&strlen(s2)>=len1;s2++) //循环改变s2的开始位置     {         for (i=0;i<len1;i++) //用for循环从s2开始位置截取子串             s[i] = s2[i];         if (strcmp(s, s1) == 0) //如果截取的子串和s1相同             return 1;     }     free(s); //释放临时变量     return 0; } 我知道了，谢谢

user: user-0
content: 引用 17 楼 轻箬笠的回复:int instring(char *s1,char *s2) {     if (strlen(s1) == 0)return 1;          char buf[100];     do{         if (strlen(s1) > strlen(s2))return 0;         int i = 0;         for (; i < strlen(s1); i++)             buf[i] = s2[i];         buf[i] = '\0';         if (strcmp(s1, buf) == 0)return 1;         s2++;     }while(1);     return 0; } 汗，写错了。if (strcmp(s1, s2) == 0)return 1;改成if (strcmp(s1, buf) == 0)return 1; 我知道了，谢谢

user: user-4
content: int instring(char *s1,char *s2) {     if (strlen(s1) == 0)return 1;          char buf[100];     do{         if (strlen(s1) > strlen(s2))return 0;         int i = 0;         for (; i < strlen(s1); i++)             buf[i] = s2[i];         buf[i] = '\0';         if (strcmp(s1, buf) == 0)return 1;         s2++;     }while(1);     return 0; } 汗，写错了。if (strcmp(s1, s2) == 0)return 1;改成if (strcmp(s1, buf) == 0)return 1;

user: user-4
content: int instring(char *s1,char *s2) {     if (strlen(s1) == 0)return 1;          char buf[100];     do{         if (strlen(s1) > strlen(s2))return 0;         int i = 0;         for (; i < strlen(s1); i++)             buf[i] = s2[i];         buf[i] = '\0';         if (strcmp(s1, s2) == 0)return 1;         s2++;     }while(1);     return 0; } 那改成这样，原来memset和memcpy都不能用啊

user: user-3
content: 引用 14 楼 其实一开始我是拒绝的 的回复:mencpy怎么改成for循环？ memcpy改成for的版本在11L

user: user-0
content: 引用 9 楼 qybao的回复:一定要用strcmp吗？不能用strncmp吗？ 用strcmp的版本  int instring(char *s1,char *s2) {     int len1;     if(s1==NULL || s2==NULL) return 0;     len1 = (int)strlen(s1);     char *s = (char*)malloc(sizeof(char)*(len1+1)); //用个临时字符串     memset(s, '\0', len1+1);     for(;*s2!='\0'&&strlen(s2)>=len1;s2++)  //循环改变s2的开始位置     {         memcpy(s, s2, len1); //从s2开始位置截取leng1长度的子串（这里用了memcpy，可以自己循环一个一个字符赋值）         if (strcmp(s, s1) == 0) //比较截取的子串是否和s1相同             return 1;     }     free(s);     return 0; }   用strncmp的版本 int instring(char *s1,char *s2) {     int len1;     if(s1==NULL || s2==NULL) return 0;     len1 = (int)strlen(s1);     for(;*s2!='\0'&&strlen(s2)>=len1;s2++) //循环改变s2的开始位置     {         if (strncmp(s2, s1, len1) == 0) //从s2的开始位置比较len1个字符是否和s1相同             return 1;     }     return 0; } mencpy怎么改成for循环？

user: user-0
content: 引用 10 楼 轻箬笠的回复:[quote=引用 8 楼 其实一开始我是拒绝的 的回复:] 能不能改成for循环 ，menset（）还没学 for (int i = 0; i < strlen(buf); i++)buf[i] = '\0';[/quote] b【i】是写在for循环里面的？

user: user-0
content: 引用 10 楼 轻箬笠的回复:[quote=引用 8 楼 其实一开始我是拒绝的 的回复:] 能不能改成for循环 ，menset（）还没学 for (int i = 0; i < strlen(buf); i++)buf[i] = '\0';[/quote] b【i】是写在for循环里面的？

user: user-3
content: 用strcmp的（不用memcpy的版本） int instring(char *s1,char *s2) {     int len1,i;     if(s1==NULL || s2==NULL) return 0;     len1 = (int)strlen(s1);     char *s = (char*)malloc(sizeof(char)*(len1+1)); //用个临时变量保存子串     s[len1] = '\0';     for(;*s2!='\0'&&strlen(s2)>=len1;s2++) //循环改变s2的开始位置     {         for (i=0;i<len1;i++) //用for循环从s2开始位置截取子串             s[i] = s2[i];         if (strcmp(s, s1) == 0) //如果截取的子串和s1相同             return 1;     }     free(s); //释放临时变量     return 0; }

user: user-4
content: 引用 8 楼 其实一开始我是拒绝的 的回复:能不能改成for循环 ，menset（）还没学 for (int i = 0; i < strlen(buf); i++)buf[i] = '\0';

user: user-3
content: 一定要用strcmp吗？不能用strncmp吗？ 用strcmp的版本  int instring(char *s1,char *s2) {     int len1;     if(s1==NULL || s2==NULL) return 0;     len1 = (int)strlen(s1);     char *s = (char*)malloc(sizeof(char)*(len1+1)); //用个临时字符串     memset(s, '\0', len1+1);     for(;*s2!='\0'&&strlen(s2)>=len1;s2++)  //循环改变s2的开始位置     {         memcpy(s, s2, len1); //从s2开始位置截取leng1长度的子串（这里用了memcpy，可以自己循环一个一个字符赋值）         if (strcmp(s, s1) == 0) //比较截取的子串是否和s1相同             return 1;     }     free(s);     return 0; }   用strncmp的版本 int instring(char *s1,char *s2) {     int len1;     if(s1==NULL || s2==NULL) return 0;     len1 = (int)strlen(s1);     for(;*s2!='\0'&&strlen(s2)>=len1;s2++) //循环改变s2的开始位置     {         if (strncmp(s2, s1, len1) == 0) //从s2的开始位置比较len1个字符是否和s1相同             return 1;     }     return 0; }

user: user-0
content: 引用 5 楼 轻箬笠的回复:int instring(char *s1,char *s2) {     if (strlen(s1) == 0)return 1;          char buf[100];     do{         if (strlen(s1) > strlen(s2))return 0;         memset(buf, 0, sizeof(buf));         memcpy(buf, s2, strlen(s1));         if (strcmp(s1, buf) == 0)return 1;         s2++;     }while(1);     return 0; } 这样试试，楼主测试看看。 能不能改成for循环 ，menset（）还没学

user: user-0
content: 引用 6 楼 chxchxkkk的回复:用strcmp的话可以参考  int instring(char *s1, char *s2)  {       if (strcmp(s1, s2) == 0)            return 1;      else           return 0;   }  这样好像不行啊