判断单词前缀

这是今天复习的一题代码,不是很难,就是想分享一下编写的过程和思路

这个题目是需要我们从键盘输入一个英文句子,然后输入自己想要查找的前缀,查看句子中是否有这个前缀,如果有,就返回这个前缀所在单词的下标,也就是返回这是第几个单词,如果没有,则返回-1,如果有多个,则返回最前面的单词的下标。

首先是变量的设定,在变量上,我设置了比较多的变量用于存放不同的数值。总体上设置了三个数组,数组sentence用于存放使用者输入的句子,searchWord用于存放想要查找的单词前缀,word用于存放单词前缀所在单词。

同时我还设置了四个整型变量,这些变量放在while,if和for循环中作为判断条件和数据计算,变量i和j用于做循环条件,n作为计算单词个数的变量,x是存放前缀所在单词的下标。

在这串代码中运用了比较多的循环和判断语句,为了理清思路,我在这里尽量详细的逐一解释。

    printf("请输入一个英文句子,单词与单词用空格隔开:\n");
	gets(sentence);
	printf("请输入想要查找的单词前缀:\n");
	gets(searchWord);

显而易见,这几行代码是告知使用者需要进行的操作和从键盘得到输入的字符串。使用gets是因为gets在获取字符串的时候不会因为空格而终止获取字符的操作,会将空格一同保存在数组当中,如果使用scanf作为输入语句,则会发现键入空格之后,接收字符就停止了。

在得到字符之后是一个while大循环用于遍历sentence数组里面的英文语句,在这个遍历过程当中我加入了两个if判断语句。首先是第一个:

if (sentence[i] == ' ')
	n++;

这个判断条件是用于找到空格以便记录此时遍历到的字符处于英文语句中的第几个单词位置。这里需要注意,n的初始值设定为1,因为当我们开始遍历,就已经处于第一个单词的位置,往后找到空格,空格后是第二个单词,单词数始终比空格数多一个。虽然可以在判断条件里面加上终止符,将终止符也算在内,但是由于外面的大循环的条件是不包含'\0',所以这里需要将n初始值设定为1。

随后是第二个判定条件,用于找到前缀所在的单词

if (sentence[i] == searchWord[j] && searchWord[j] != '\0') {
	word[j] = sentence[i];
	j++;
	x = n;
}

这里对于j的初始值设定是0,要从前缀的第一个字符开始比较,因为题目要求在具有两个及以上单词的时候输出最小的下标,所以要加上判定条件'\0'并且在这个代码运行过后不将j清零重置。如果需要输出最大的下标,则还要在判定后面加上j==0用于重置。

到这里,while循环整体就已经结束了,完成了任务,计算得到了单词的下标。接下来就是判断句子中有没有这个前缀了。在这里我进行了很久的犹豫和修改,因为对于c语言的了解和学习还比较浅显,对于代码的编写也比较生疏,因此在这里有了卡壳。

最开始是尝试着将判定条件直接加到while循环里面,但是我发现这样操作只可以完成句子中包含前缀的部分,对于句子中没有这个前缀返回-1这个功能没能实现。经过思考,我设置了word数组用于存放包含前缀的单词,while循环的外面加了if判定用于判断是否有这个单词。如果word数组里面的字符长度为0,或者小于前缀的长度,那么就说明这个句子当中没有包含这个前缀的单词,如果大于等于,则包含,根据此可以进行选择输出单词下标还是-1。

但是写到这里又发现另外一个问题,就是如果前面有了单词的重复,但是并不包括单词,例如句子中先出现了printf随后出现了progress,我们需要找到前缀pro,那么在while循环里面的判定条件是不是有了问题呢。

其实是有的,所以我尝试着在判定条件里面再嵌入一个判定条件,如果我们找到的字符长度小于前缀的长度,则让j置零重新计算,这样就可以解决相似字符的问题了。

这里就是全部的思考,后面会附上代码,欢迎朋友指教。

    while(sentence[i]) {
			if (sentence[i] == ' ')
				n++;
			if (sentence[i] == searchWord[j] && searchWord[j] != '\0') {
				word[j] = sentence[i];
				j++;
				x = n;
				if (strlen(word) < strlen(searchWord))
					j = 0;
			}
			i++;
	}
	word[++j] = '\0';
	if (strlen(word) >= strlen(searchWord))
		printf("%d",x);
	else
		printf("-1");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

箬渊凡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值