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
分享
二维码
< <上一篇
下一篇>>