查找字符串子串用strcmp函数

AC_YE 2020-05-27 10:16:01
#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] }  在函数定义那里使用strcmp函数实现该功能
...全文
823 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_38107562 2020-05-29
  • 打赏
  • 举报
回复
学习。。。。。。。
YGLeeeon 2020-05-28
  • 打赏
  • 举报
回复
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++);
}
AC_YE 2020-05-28
  • 打赏
  • 举报
回复
引用 23 楼 qybao的回复:
[quote=引用 22 楼 其实一开始我是拒绝的 的回复:]

不用动态分配,直接char*s【20】=NULL可以?

就你的代码而言,s1肯定不会超过20(name[20]),所以不用动态分配,用char s[20] = {0}; 也可以,这样连s[len1]='\0'也可以省了[/quote] 好,,,,,,,
qybao 2020-05-28
  • 打赏
  • 举报
回复
引用 22 楼 其实一开始我是拒绝的 的回复:
不用动态分配,直接char*s【20】=NULL可以?

就你的代码而言,s1肯定不会超过20(name[20]),所以不用动态分配,用char s[20] = {0}; 也可以,这样连s[len1]='\0'也可以省了
AC_YE 2020-05-28
  • 打赏
  • 举报
回复
引用 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可以?
qybao 2020-05-28
  • 打赏
  • 举报
回复
引用 20 楼 其实一开始我是拒绝的 的回复:
为什么s【len1】要等于字符串结束符

因为s的最后一个字符是字符串结尾符,s申请内存的长度是len1+1就是为了让s的最后一个字符保存字符串结尾符,从s2循环赋值给s只用到len1个字符(从s[0]到s[len1-1]),所以最后一个字符就是s[len1]
AC_YE 2020-05-28
  • 打赏
  • 举报
回复
引用 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】要等于字符串结束符
AC_YE 2020-05-28
  • 打赏
  • 举报
回复
引用 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;
}
我知道了,谢谢
AC_YE 2020-05-28
  • 打赏
  • 举报
回复
引用 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;
我知道了,谢谢
轻箬笠 2020-05-28
  • 打赏
  • 举报
回复
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;
轻箬笠 2020-05-28
  • 打赏
  • 举报
回复
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都不能用啊
qybao 2020-05-28
  • 打赏
  • 举报
回复
引用 14 楼 其实一开始我是拒绝的 的回复:
mencpy怎么改成for循环?

memcpy改成for的版本在11L
AC_YE 2020-05-28
  • 打赏
  • 举报
回复
引用 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循环?
AC_YE 2020-05-28
  • 打赏
  • 举报
回复
引用 10 楼 轻箬笠的回复:
[quote=引用 8 楼 其实一开始我是拒绝的 的回复:] 能不能改成for循环 ,menset()还没学
for (int i = 0; i < strlen(buf); i++)buf[i] = '\0';[/quote] b【i】是写在for循环里面的?
AC_YE 2020-05-28
  • 打赏
  • 举报
回复
引用 10 楼 轻箬笠的回复:
[quote=引用 8 楼 其实一开始我是拒绝的 的回复:] 能不能改成for循环 ,menset()还没学
for (int i = 0; i < strlen(buf); i++)buf[i] = '\0';[/quote] b【i】是写在for循环里面的?
qybao 2020-05-28
  • 打赏
  • 举报
回复
用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;
}
轻箬笠 2020-05-28
  • 打赏
  • 举报
回复
引用 8 楼 其实一开始我是拒绝的 的回复:
能不能改成for循环 ,menset()还没学
for (int i = 0; i < strlen(buf); i++)buf[i] = '\0';
qybao 2020-05-28
  • 打赏
  • 举报
回复
一定要用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;
}
AC_YE 2020-05-28
  • 打赏
  • 举报
回复
引用 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()还没学
AC_YE 2020-05-28
  • 打赏
  • 举报
回复
引用 6 楼 chxchxkkk的回复:
用strcmp的话可以参考

int instring(char *s1, char *s2)
 {
      if (strcmp(s1, s2) == 0) 
          return 1;
     else
          return 0;  
}
这样好像不行啊
加载更多回复(5)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧