| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1767 人关注过本帖
标题:[求助]字符串比较问题
只看楼主 加入收藏
神经塔
Rank: 6Rank: 6
等 级:贵宾
威 望:20
帖 子:1986
专家分:4
注 册:2006-7-1
结帖率:0
收藏
 问题点数:0 回复次数:9 
[求助]字符串比较问题

最近我在做一道题目,具体的意思是:要求用户写入两个字符串,然后做比较,看看第二个字符串是否在第一个字符串中是否包含,如果包含,那说明在第一个字符串中的什么位置!我想 了写时候,编程思想都没有想出来!求救!我知道用字符串比较函数吧!

搜索更多相关主题的帖子: 字符 函数 思想 
2006-08-01 22:53
神经塔
Rank: 6Rank: 6
等 级:贵宾
威 望:20
帖 子:1986
专家分:4
注 册:2006-7-1
收藏
得分:0 
难道没有人会这道问题吗?

[shadow=255,red,2]待到秋来九月八,我花开时百花杀。冲天香阵透长安,满城尽是黄金甲。 [/shadow]
2006-08-01 23:21
论坛
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1372
专家分:0
注 册:2006-3-27
收藏
得分:0 
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

#define MAXLINE 80

int strindex(const char *str1, const char *str2);

int main(void)
{
char str1[MAXLINE], str2[MAXLINE];
int pos;

printf("Enter str1: \n");
fgets(str1, MAXLINE, stdin);
str1[strlen(str1) - 1] = '\0';
printf("Enter str2: \n");
fgets(str2, MAXLINE, stdin);
str2[strlen(str2) - 1] = '\0';

pos = strindex(str1, str2);

if (pos != -1)
printf("pos = %d\n", pos);
else
printf("no found.\n");

exit(0);
}

int strindex(const char *str1, const char *str2)
{
int i, j, k;
for (i = 0; str1[i] != '\0'; i++) {
for (k = i, j = 0; str2[j] != '\0'; )
if (str1[k] == str2[j])
k++, j++;
else
break;

if (str2[j] == '\0' && j > 0)
return(i);
}

return(-1); /* no found state */
}





日出东方,唯我不败! 做任何东西都是耐得住寂寞,任何一个行业要有十年以上的积累才能成为专家
2006-08-01 23:31
haroldi
Rank: 1
等 级:新手上路
帖 子:158
专家分:0
注 册:2006-7-22
收藏
得分:0 
*strstr(...)

Do people want thick road ...
2006-08-02 00:40
boyatec
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2006-7-28
收藏
得分:0 

#include<string.h>
int match(char *s1,char *s2)
/*匹配函数,-1,出错 0没有找到匹配*/
{
int m,n,i,j;
char *p,*q;

m=strlen(s1);n=strlen(s2);
int match(char *s1,char *s2)
{
int i,j;
if(strlen(s2)>strlen(s1)
{
printf("error");
return -1;
}
for(i=0;i<strlen(s1);i++)
{
p=s1+i;
for(j=0;j<strlen(s2);j++)
{
q=s2+j;
if(*p!=*q)
break;

p++
}
if(*q=='\0')
return i;
}
return 0;
}
main()
{
char a[80];
char b[20];
int i;
printf("Pleashe input two strings\n");
gets(a);
gets(b);
i=match(a,b);
if(i>0)
printf("the string is matched\n");
else
printf("the strings are not matched\n");
}
兄弟,随便写写的不知道有没有错!

[此贴子已经被作者于2006-8-2 7:31:37编辑过]

2006-08-02 07:29
神经塔
Rank: 6Rank: 6
等 级:贵宾
威 望:20
帖 子:1986
专家分:4
注 册:2006-7-1
收藏
得分:0 

谢谢各位,还有没有更好的想法啊!说说编程思想就行啊!


[shadow=255,red,2]待到秋来九月八,我花开时百花杀。冲天香阵透长安,满城尽是黄金甲。 [/shadow]
2006-08-02 07:56
神经塔
Rank: 6Rank: 6
等 级:贵宾
威 望:20
帖 子:1986
专家分:4
注 册:2006-7-1
收藏
得分:0 
我看了看三楼的做法还有思想很好,真是佩服!3楼的怎么想出来的??

[shadow=255,red,2]待到秋来九月八,我花开时百花杀。冲天香阵透长安,满城尽是黄金甲。 [/shadow]
2006-08-02 07:59
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
收藏
得分:0 

贴个效率高一点的,几个星期前学习串操作时写的KMP子串查找法,写了详细注释了,书上有KMP偏量计算的子函数,这里我全部省略了,合进了一个函数中,进行实时偏量计算。

#include <stdio.h>
#include <conio.h>

inline int KMP(char *s,char *p);

int main() {
char *s1 = "abacabcdabbab";
char *s2 = "abc";
printf("index = %d\n",KMP(s1,s2));
getch();
return 0;
}

/************************************************
*
* 函数名: KMP
*
* 参数表: s - 主串的指针; p - 模式串的指针
*
* 功能介绍: 比较p是否为s的子串,若是则返回在
* s中起始的索引号。
*
************************************************/

inline int
KMP(char *s, char *p) {
char *ptr_s = s; /* 映射字符串指针s */
char *ptr_p = p; /* 映射字符串指针p */
char *ptr_bak = s; /* 用于定位在*ptr_s与*p内容相同的位置 */

int addr_delta; /* 计算相匹配的内容长度,调整ptr_p对比起始位置 */

while(*ptr_s && *ptr_p) {
if(*ptr_s == *ptr_p) {
/* 如果匹配字符与对比串的首字符相等,则备份该指针 */
if(*ptr_s == *p)
ptr_bak = ptr_s;
++ptr_s;
++ptr_p;
}
else {
/* 计算新位置与备份指针的差,这便是以匹配的字符数,从而使p+addr_delta获得开始匹配的起始位置 */
addr_delta = (int)(ptr_s - ptr_bak);
/* 若备份位置与当前位置相同,则将当前位置一下下一个位置,从头开始比较 */
if(!addr_delta) {
++ptr_s;
ptr_bak = ptr_s;
ptr_p = p;
}
else {
ptr_p = p + addr_delta;
/* 若备份位置与模式串的首位置都不匹配当前位置的字符串,则继续向后比较,重设备份位置和匹配位置 */
if(*ptr_p != *ptr_s && *p != *ptr_s) {
++ptr_s;
ptr_bak = ptr_s;
ptr_p = p;
}
else {
/* 若备份位置与当前位置字符不匹但与模式串首字符相匹,则重设匹配位置和备份位置 */
if(*p == *ptr_s) {
ptr_p = p;
ptr_bak = ptr_s;
}
}
}
}
}
if(*ptr_p)
return -1;
else
/* 计算索引 */
return (int)((ptr_s - s) - (ptr_p - p));
}

[此贴子已经被作者于2006-8-2 11:32:59编辑过]


我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2006-08-02 11:25
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
模式匹配问题。

朴素模式匹配算法:主串从1开始与子串比较,符合则退出,否则从第2个字符开始比较。如此往复,直到匹配成功。

快速模式匹配算法就是楼上说的KMP了。

倚天照海花无数,流水高山心自知。
2006-08-02 11:39
xuanze123qaz
Rank: 1
等 级:新手上路
帖 子:3
专家分:5
注 册:2012-3-13
收藏
得分:0 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    int i,j,k,n=0;
    char a[10000],b[1000000];
    gets(a);
    gets(b);
   for(i=0;i<=strlen(b)-strlen(a);i++){
   if(a[0]==b[i]){
                  k=i;
                  for(j=0;j<=strlen(a)-1;j++,i++)
                  {if(a[j]!=b[i])j=strlen(a);
                  else if(j==strlen(a)-1)n++;}
                  i=k;
                  }}
                  printf("%d\n",n);
    system("PAUSE");
    return 0;
}
2012-03-20 10:04
快速回复:[求助]字符串比较问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.038625 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved