C语言:在一个字符串中查找最长的单词,假定字符串只含有字母与空格,且空格用于分隔不同的单词。(指针和数组赋值两种思想)
前情提要:这个实验题是学习二维数组时的一个附加题,从构思到整体结构的搭建再到最后改BUG肝了好几个晚上(太菜了太菜了),但最后还是存在一些小BUG以及程序效率过低的情况,最后摆烂了留下了烂尾楼,直至今天虽然临近期末但又重新拾起来改了改。由于当时未使用指针,导致整个程序显得十分复杂,且运行效率较低,今天收拾烂摊子的时候又用指针写了一遍,相比之下运行效率有较大提升。相比CSDN其他博主写的二十行左右的代码就干完了的情况,我还是太菜啦。
#include <stdio.h>
#include <string.h>
int COUNT(char a[]);
char DELETE(char x[]);
int main()
{
int i,j,k=0,max,count=0;
char sentence[1000];
int word_number[10];//存储每个单词的字母数
char WORD[10][100];//存储每个单词
printf("putchar sentencen");
gets(sentence);
计算句子中单词的个数
烂尾的程序原来写的是通过不断删掉空格前的单词来计数,但效率极其低,现进行改进,利用空格数+1来计算;
for(i=0;sentence[i]!='';i++)
{
if(sentence[i]==' ')
count++;
}
count++;
利用二维字符数组存储每个单词
这里容易忽略的一点是,每个单词之间用空格连接,可以用是否等于'空格'来判断一个单词的结束,但最后一个单词后面是'',需要对最后一个单词进行单独处理;
for(i=0;i<count;i++)//二维字符数组存储每个单词
{
for(j=0;sentence[j]!=' ';j++)
{
WORD[i][j]=sentence[j];
}
word_number[i]=j;
WORD[i][j]='';
if(i<count-1)//留下最后一个单词
{
sentence[1000]=DELETE(sentence);
}
}
int count_last=0;
for(i=0;sentence[i]!='';i++)
count_last++;
word_number[count-1]=count_last;
单词长度的比较
利用存单词长度的数组中的每个数字进行比较,记录其数组下标,最后输出相应最长的单词;
max=word_number[0];
for(i=1;i<count;i++)//单词长度的比较
{
if(word_number[i]>max)
{
max=word_number[i];
k=i;
}
}
printf("最长的单词:%s",WORD[k]);//输出最长的单词
return 0;
}
COUNT函数功能:计算空格前字符串的长度
int COUNT(char words[])//计算空格前字符串的长度
{
int count=0;
for(int i=0;words[i]!=' ';i++)
count++;
return count;
}
DELETE函数功能:删除空格及之前的字符串
char DELETE(char x[])//删除空格及之前的字符串
{
int i,j,count1,count2;
count1=strlen(x);
for(i=0;x[i]!=' ';i++)
count2=i;
for(i=0,j=count2+2;i<=count1-count2;i++,j++)
x[i]=x[j];
return x[1000];
}
算法优化:
利用指针指向字符数组的不同位置,将句子分割成不同单词的同时计算其长度;
需要注意的是:指针每次遇到空格,存入前一个单词后,需要进行p++后移操作跳过空格,指向空格后下一个单词的首字母;
for(i=0;i<count;i++)
{
count_word=0;
for(j=0;*p!=' ';p++,j++)
{
WORD[i][j]=*p;
count_word++;
}
WORD[i][j]='';
word_number[i]=count_word;
p++;
}
和第一种编程思想一样,需要对最后一个单词进行单独操作;取出单词后不要忘记在下一个位置添加'';由于*p!=''的限制,使得最后未进入for循环,但已经进行j++操作,所以存入时存在WORD[i][j],而不是WORD[i][j+1];
count_word=0;
for(j=0;*p!='';p++,j++)
{
WORD[i][j]=*p;
count_word++;
}
WORD[i][j]='';
word_number[i]=count_word;
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
二维码