仅使用字符数组(有string.h无string定义)筛选一串字符并获得一句话中的最长单词

#include <stdio.h>
#include <string.h>

int main()
{
	char x[1000];				//定义原始数组
	char y[1000] = {};			//定义去掉符号后的数组
	gets_s(x);
	int length = strlen(x);

	for (int i = 0; i <= length; i++)
	{

		if ((65 <= x[i] && x[i] <= 90) || (97 <= x[i] && x[i] <= 122))				//判断当前遍历对象是否为字母
		{
			char meme[2] = { x[i] };																//取当前字母
			strcat_s(y, meme);																			//存入y中
		}
		else if (x[i] == ' ')																				//存空格
		{
			strcat_s(y, " ");
		}
		else
		{
			continue;																						//跳过符号
		}
	}

	int len1 = strlen(y);																				
	int c = 0;																								//读进单词中字母的位数
	int storage = 0;																					//储存最大位数
	char z[1000] = {};																					//将y分割为最大位数长度的数组
	char k[1000] = {};																					//用一个空数组刷新每次比较完后的结果,方便重复比较

	for (int m = 0; m < len1; m++)
	{


		if ((65 <= y[m] && y[m] <= 90) || (97 <= y[m] && y[m] <= 122))
		{
			c++;																								//如果是字母,位数+1
		}

		if (y[m] == ' ')																					//遇到空格即截断为一个单词
		{
			if (c >= storage)
			{
				storage = c;																				//若刚刚读进的单词的字母个数>储存最大位数,则更新最大位数

			}
			c = 0;																							//读进位数清零,准备读进下一个单词
		}

		if (m == len1 - 1)																				//最后一个单词末尾没有空格,单独判断单词是否结束
		{
			if (c >= storage)
			{
				storage = c;
			}
			c = 0;
		}
	}

	int count = 0;																						//现在已知最长单词的最大位数,需要确定该最长单词的位置,所以每次取最大位数的字符到新的字符数组中,若该新数组内无空格,则说明为一连续完整单词,即我们需要的最长单词

	for (int i = 0; i < len1; i++)
	{
		strcpy_s(z, k);																						//在每次比较完后用空数组刷新取出的新字符数组
		for (int j = i; j < i + storage; j++)
		{
			char nomi[2] = { y[j] };																	//每次取最大位数个字符(含字母和空格)进入新字符数组,如最大位数为4,则第一次取第1、2、3、4位,第二次取2、3、4、5位
			strcat_s(z, nomi);
    	}
		for (int g = strlen(z) - storage; g < strlen(z); g++)
		{

			if (z[g] != ' ')					
			{
				count++;																					//新字符数组遍历,没有空格时,完整度+1
			}
			if (z[g] == ' ')																				//有空格时,说明我们当前取出来的不是一个完整的单词,完整度清零,重新读取
			{
				count = 0;
				break;
				
			}
			if (count == storage)																	//完整度符合最大位数时,说明正是我们需要的单词,输出,完整度清零以便继续寻找长度为最大值的单词(当一句话中有多个长度最大&一样的单词时)
			{
				printf("%s ",z);
				count = 0;
			}
		}
	}

	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值