C语言学习:输入一行字符串,输出字符串中最长的单词。

输入一行字符,编写一个函数,将此字符串中最长的单词输出。

代码示例如下:

一、输出字符串中第一个最长单词

#include<stdio.h>
#include<string.h>
void longest(char str[],char word[])
{
     int i,j;
	 char b[50];
	 for(i=0;str[i]!='\0';i++)
	 {
	     j=0;
		 while(str[i]>='a' && str[i]<='z' || str[i]>='A' && str[i]<='Z')
			 b[j++]=str[i++];
		     b[j]='\0';
			 if(strlen(b)>strlen(word))
				 strcpy(word,b);
	 }
}
int main()
{
     char str[100],word[45];
	 word[0]='\0';
	 printf("请输入一行字符:\n");
	 gets(str);
	 longest(str,word);
	 printf("最长的单词是:\n");
	 puts(word);
	 return 0;
}

测试结果: 

c37e777f851c45b0931f921addd0c79c.png

二、输出字符串中所有最长单词

评论区指出上述程序不能输出同样最长的两个单词,修改后该程序能输出所有最长单词,即如果有多个同样最长单词的单词,会全部输出。在修改途中发现如果想要相同单词仅输出一个(不重复)还需要修改。

#include<stdio.h>
#include<string.h>
void longest(char str[],char word[])
{
     int i,j,max_len=0;
     char b[50],longest_word[45];
     longest_word[0]='\0';
     for(i=0;str[i]!='\0';i++)
     {
         j=0;
         while(str[i]>='a' && str[i]<='z' || str[i]>='A' && str[i]<='Z')
             b[j++]=str[i++];
         b[j]='\0';
		   //如果当前字符串b的长度大于之前的最大长度,则更新最大长度和最长单词
         if(strlen(b)>max_len)
         {
             max_len=strlen(b);
             strcpy(longest_word,b);
         }
		  //如果当前字符串b的长度等于之前的最大长度,则将其加入到最长单词中
         else if(strlen(b)==max_len)
         {
             strcat(longest_word," ");
             strcat(longest_word,b);

         }
     }
     strcpy(word,longest_word);
}
int main()
{
     char str[100],word[45];
     word[0]='\0';
     printf("请输入一行字符:\n");
     gets(str);
     longest(str,word);
     printf("最长的单词是:\n");
     puts(word);
     return 0;
}

测试结果:

三、输出字符串中所有最长单词(不重复)

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

void longest(char str[],char word[])
{
     int i,j,k,max_len=0,count=0;
     char b[50],longest_word[45],compare[10][45];
     longest_word[0]='\0';
     compare[0][0] = '\0';
     for(i=0;str[i]!='\0';i++)
     {
         j=0;
         while(str[i]>='a' && str[i]<='z' || str[i]>='A' && str[i]<='Z')
             b[j++]=str[i++];
         b[j]='\0';
		 
         if(strlen(b) > max_len)
         {
             
             max_len=strlen(b);
             strcpy(longest_word,b);
             count = 1;
             memset(compare, '\0', sizeof(compare)); //清空数组
			 strcpy(compare[1], b); //创建一个二维数组存储最长单词,方便对比是否相同
             
         }
         
         else if (strlen(b) == max_len)
         {
             int flag = 0;
             for (k = 1; k <= count; k++)
                 if (strcmp(b, compare[k]) == 0) //b中的单词和compare数组中的单词逐个对比
                 {
                     flag = 1;
                     break;
                 }
             if (flag == 0)//如果不相同,将单词加入longest_word中
             {
                 strcat(longest_word, " ");
                 strcat(longest_word, b);
                 count++;
                 strcpy(compare[count], b); //将单词放入compare中,继续筛查新单词后序是否重复
             }
         }
     }

     strcpy(word,longest_word);

}

int main()
{
    char str[100], word[45]={0};
     printf("请输入一行字符:\n");
     gets(str);
     longest(str,word);
     printf("最长的单词是:\n");
     puts(word);
     return 0;
}

测试结果:

上面写的有点乱,而且有些数组没有必要,如果需要节省分配空间可以修改一下下:

void longest(char str[])
{
     int i,j,k,max_len=0,count=0;
     char b[50],longest_word[10][45];
     longest_word[0][0] = '\0';
     for(i=0;str[i]!='\0';i++)
     {
         j=0;
         while(str[i]>='a' && str[i]<='z' || str[i]>='A' && str[i]<='Z')
             b[j++]=str[i++];
         b[j]='\0';
		 
         if(strlen(b) > max_len)
         {        
             max_len=strlen(b);
             memset(longest_word, '\0', sizeof(longest_word));
			 strcpy(longest_word[1], b);
             count = 1;
         }
         
         else if (strlen(b) == max_len)
         {
             int flag = 0;
             for (k = 1; k <= count; k++)
                 if (strcmp(b, longest_word[k]) == 0)
                 {
                     flag = 1;
                     break;
                 }
             if (flag == 0)
             {
                 count++;
                 strcpy(longest_word[count], b);
             }
         }
     }
     printf("最长的单词是:\n");
     for (k = 1; k <= count; k++)
         puts(longest_word[k]);
}

int main()
{
    char str[100];
     printf("请输入一行字符:\n");
     gets(str);
     longest(str);
     return 0;
}

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
心中带点小风骚的头像心中带点小风骚普通用户
上一篇 2023年12月19日
下一篇 2023年12月19日

相关推荐