#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;
}
仅使用字符数组(有string.h无string定义)筛选一串字符并获得一句话中的最长单词
于 2022-04-17 13:07:09 首次发布