{请教}the c primer plus 第11章第7题

a5156520 2012-12-22 08:36:32
题目如下:
编写一个函数string_in(),它接受两个字符串指针参数。如果第二个字符串包含在第一个字符中,函数返回被包含的字符串开始的地址。例如,sting_in("hats","at"),返回hats中a的地址,否则,函数返回空指针。在一个使用循环语句为这个函数提供输入的完整程序中进行测试。
自己写的如下:代码有问题,但不知道错在哪里,请教。
#include <stdio.h>
#include <string.h>
char *string_in(char *str1,char *str2);
int main()
{
char ch1[50];
char ch2[20];
char *str;

puts("Enter the first string.(Enter a space line to quit)");
while(gets(ch1)&&*ch1!='\0')
{
puts("Enter the second string.");
gets(ch2);
str=string_in(ch1,ch2);
if(str==NULL)
printf("%s not in %s.\n",ch2,ch1);
else
{
printf("%s in %s begin with:",ch2,ch1);
puts(str);
}
puts("Enter the first string.(Enter a space line to quit)");
}

fflush(stdin);
getchar();
return 0;
}

char *string_in(char *str1,char *str2)
{
int i=0, k=0;
int sub,l;
int ct=0;

if(strlen(str2)<=strlen(str1))
{
if(k<=strlen(str1)+1) //str1[k]相比的字符允许往后一个,保证比较完str2[i]中的字符
{
if(!ct&&!(str2[i]-str1[k++]))//开始寻找与str2第一个字符相同的str1中的字符
{
ct++; //相同字符计数器
sub=((k-1)>=0?(k-1):0);//囊括str1第一个字符即与str2第一个字符相同的情况
}
if(ct&&!(str2[++i]-str1[k++])&&(k<=strlen(str1)+1))//str2与str1比较第一个字符之后的字符
ct++; //相同字符计数器
if(ct<strlen(str2)) //如果此次寻找的第一个相同字符之后的字符串未能囊括str2,寻找str1下一个中与str2第一个字符相同的字符
{
i=0;
k=sub+1; //保证从str1第一个与str2首字符相同的字符之后开始比较
ct=0; //相同字符初始计数
}
}

if(ct==strlen(str2))
return (str1+sub);
else
return NULL;
}
else
return NULL;
}

...全文
304 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
14号选手 2012-12-23
  • 打赏
  • 举报
回复
那你把参考答案贴出来吧,你不愿意参考我写的就算了,何必说是参考答案呢 参考答案跟我写的一字不差吗,呵呵,对你无语
14号选手 2012-12-23
  • 打赏
  • 举报
回复
引用 11 楼 a5156520 的回复:
引用 9 楼 xuchao1229 的回复:引用 7 楼 a5156520 的回复:引用 6 楼 xuchao1229 的回复:引用 5 楼 a5156520 的回复:大哥 太简单了吧 什么意思??? 要弄得很复杂,很多层的逻辑判断进去????? 程序简洁一些,运行高效一点不是更好吗。。。。。。 strstr函数本身就是解了啊 等下,贴错了 应该是这个 ……
参考答案???这个是我自己写的好吗 参考答案长什么样我都没见过 晕
14号选手 2012-12-23
  • 打赏
  • 举报
回复
引用 22 楼 a5156520 的回复:
原来的编译器不好调试,现在好了。反正是随便来问下,分给你把。
你用的是什么IDE 这样吧,你尽量把逻辑不要弄的嵌套太多,判断也不要太多,多了话,一个是资源利用率低下 再一个这样也让以后修改或者维护你代码的人不愿意去看你的代码 所以尽量直接进入主题好些,希望能帮到你,呵呵
14号选手 2012-12-23
  • 打赏
  • 举报
回复
引用 20 楼 a5156520 的回复:
引用 19 楼 xuchao1229 的回复:引用 18 楼 a5156520 的回复:引用 16 楼 xuchao1229 的回复:引用 15 楼 a5156520 的回复:你写的简洁明了,和参考答案不同,是我讲错了,verygood。是本人比较愚笨固执,对自己的代码太较真。希望你可以帮帮在下找找错误,非常感谢。 呵呵 麻烦把我先发的哪一个删掉吧,那一个的确是逻辑上……
多调试几遍 思路都给你讲的这么清楚了啊
14号选手 2012-12-23
  • 打赏
  • 举报
回复
引用 18 楼 a5156520 的回复:
引用 16 楼 xuchao1229 的回复:引用 15 楼 a5156520 的回复:你写的简洁明了,和参考答案不同,是我讲错了,verygood。是本人比较愚笨固执,对自己的代码太较真。希望你可以帮帮在下找找错误,非常感谢。 呵呵 麻烦把我先发的哪一个删掉吧,那一个的确是逻辑上面有点错误的 我在9楼写的那个是正确的 呵呵,早就说了我的代码只是仅供参考罢了,你可……
恩,你肯定是这样想的,找到了第一个元素,然后逐个往后面罩,然后添加一个计数器,记录长度,只要这个长度跟目标字符串的长度相同,并且每个元素都相同就返回真值,其实这里多余的思考了一些 只要是存在就行了,没必要加计数器,加了计数器就相当于统计相同的个数了,上面我也给你写出来了 反正你这样想,找到第一个相同的字母,然后从字符串中截取与目标字符串相同的长度的字符串,只要相同就证明存在,不必往后查找了,直接返回真值,如果不同则继续查找,知道找到为止 呵呵,其实很简单的,没必要想的那么复杂的
14号选手 2012-12-23
  • 打赏
  • 举报
回复
引用 15 楼 a5156520 的回复:
你写的简洁明了,和参考答案不同,是我讲错了,verygood。是本人比较愚笨固执,对自己的代码太较真。希望你可以帮帮在下找找错误,非常感谢。
恩,等下回来帮你调试一下 上面是进一步修改的代码,你可以参考一下
14号选手 2012-12-23
  • 打赏
  • 举报
回复
引用 15 楼 a5156520 的回复:
你写的简洁明了,和参考答案不同,是我讲错了,verygood。是本人比较愚笨固执,对自己的代码太较真。希望你可以帮帮在下找找错误,非常感谢。
呵呵 麻烦把我先发的哪一个删掉吧,那一个的确是逻辑上面有点错误的 我在9楼写的那个是正确的 呵呵,早就说了我的代码只是仅供参考罢了,你可以从中看下思路而已 你还代码有统计相同单词的功能??? 直接增加一个函数就行了
#include <stdio.h>
#include <string.h>
#define M 100
int function(char *a,char *b)
{
	char *p=NULL,*q=NULL;
	int k=0;
	int m=strlen(a),n=strlen(b);
	for(int i=0;i<m;i++)
    {
        p=strstr(a,b);//获取b的位置等同于存在一个字符串b
        if(p)
        {
            k++;
            q=p+n;//截取字符之后索引应到达的位置
            strcpy(a,q);//将源字符串缩进到比较完毕之后的位置
            a[strlen(a)]='\0';
            q=NULL;//清空索引
            p=NULL;
        }
        else
            break;//搜索不到直接退出
    }
	return k;
}
char *string_in(char *a,char *b)
{
    char *q=NULL,buf[M];
    for(int i=0;i<strlen(a);i++)
    {
        if(b[0]==a[i])
        {
            q=a+i;//截取字符之后索引应到达的位置
            strncpy(buf,q,strlen(b));//将源字符串缩进到比较完毕之后的位置
            buf[strlen(b)]='\0';
            if(!strcmp(buf,b))
                return q;
        }
    }
    return NULL;
}
int main(void)
{
    char a[M],b[M],*p=NULL;
    while(gets(a)!=NULL&&gets(b)!=NULL)
    {
        p=string_in(a,b);
        if(p)
            printf("a中存在b字符串!\n");
        else
            printf("a中不存在b字符串!\n");
		printf("a中含有%d个字符串b\n",function(a,b));
    }
    return 0;
}
其实你的代码有一个问题,只是证明存在某个字符串,就没要统计其个数,有一个也是存在,多个也是存在 所以判断多次只是造成资源浪费,使效率低下
14号选手 2012-12-22
  • 打赏
  • 举报
回复
引用 7 楼 a5156520 的回复:
引用 6 楼 xuchao1229 的回复:引用 5 楼 a5156520 的回复:大哥 太简单了吧 什么意思??? 要弄得很复杂,很多层的逻辑判断进去????? 程序简洁一些,运行高效一点不是更好吗。。。。。。 strstr函数本身就是解了啊
等下,贴错了 应该是这个
#include <stdio.h>
#include <string.h>
#define M 100
char *string_in(char *a,char *b)
{
	char *q=NULL,buf[M];
    for(int i=0;i<strlen(a);i++)
	{
		if(b[0]==a[i])
		{
            q=a+i;//截取字符之后索引应到达的位置
            strncpy(buf,q,strlen(b));//将源字符串缩进到比较完毕之后的位置
            buf[strlen(b)]='\0';
            if(!strcmp(buf,b))
				return q;
        }
    }
	return NULL;
}
int main(void)
{
    char a[M],b[M],*p=NULL;
    while(gets(a)!=NULL&&gets(b)!=NULL)
    {
        p=string_in(a,b);
        if(p)
            printf("a中存在b字符串!\n");
        else
            printf("a中不存在b字符串!\n");
    }
    return 0;
}
14号选手 2012-12-22
  • 打赏
  • 举报
回复
引用 7 楼 a5156520 的回复:
引用 6 楼 xuchao1229 的回复:引用 5 楼 a5156520 的回复:大哥 太简单了吧 什么意思??? 要弄得很复杂,很多层的逻辑判断进去????? 程序简洁一些,运行高效一点不是更好吗。。。。。。 strstr函数本身就是解了啊
未使用strstr函数,也经过测试了
#include <stdio.h>
#include <string.h>
#define M 100
char *string_in(char *a,char *b)
{
	char *q=NULL;
    for(int i=0;i<strlen(a);i++)
	{
		if(b[0]==a[i])
		{
			q=a+i;
			for(int j=1;i<strlen(b)&&a[i+1]==b[j];i++,j++);
			if(a[i]==b[strlen(b)-1])
				return q;
			else
				return NULL;
		}
	}
	return NULL;
}
int main(void)
{
    char a[M],b[M],*p=NULL;
    while(gets(a)!=NULL&&gets(b)!=NULL)
    {
        p=string_in(a,b);
        if(p)
            printf("a中存在b字符串!\n");
        else
            printf("a中不存在b字符串!\n");
    }
    return 0;
}
14号选手 2012-12-22
  • 打赏
  • 举报
回复
引用 5 楼 a5156520 的回复:
大哥 太简单了吧
什么意思??? 要弄得很复杂,很多层的逻辑判断进去????? 程序简洁一些,运行高效一点不是更好吗。。。。。。
14号选手 2012-12-22
  • 打赏
  • 举报
回复
可以使用strstr函数来解决 如果找到则返回指针所指向地址没如果没有则返回NULL
#include <stdio.h>
#include <string.h>
#define M 100
char *string_in(char *a,char *b)
{
	char *q=NULL;
	q=strstr(a,b);
	if(q)
		return q;
	else
		return NULL;
}
int main(void)
{
	char a[M],b[M],*p=NULL;
	while(gets(a)!=NULL&&gets(b)!=NULL)
	{
		p=string_in(a,b);
		if(p)
			printf("a中存在b字符串!\n");
		else
			printf("a中不存在b字符串!\n");
	}
	return 0;
}
见笑了
Binzo 2012-12-22
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

char *string_in(char *str1,char *str2,int len_s1, int len_s2);

int main(){
	cout << hex << (int)string_in("hats","at",4,2) << endl;
	
	system("pause");
	return 0;
}

char *string_in(char *str1,char *str2,int len_s1, int len_s2){
	int flag;
	if(len_s2 > len_s1){
		return 0;
	}
	else{
		for(int i = 0; i < len_s1-len_s2; i++){
			flag = 1;
			for(int j = 0, k = i; j < len_s2; j++, k++){
				if(1 == flag && str1[k] == str2[j]){
					//flag = 1;
				}
				else{
					flag = 0;
				}
			}
			if(1 == flag){
				return str1 + i;
			}
		}
	}
	return 0;
}

69,382

社区成员

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

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