A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

#include<stdio.h>
int main()
{
    //定义一个已知的字符串
    char a[] = "we need you and forever love you";
   
    //定义一个指针指向a的首元素
    char *p = a;
   
    //定义一个指针来存放最长单词的首字母地址
    char *save;
   
    //定义单词的长度,与最长单词的长度
    int length = 0, lengthMax = 0;
   
    //循环遍历数组
    for(int i = 0; a != '\0'; i++)
    {
        //如果不为空格就使p指向的地址+1
        if(*p != ' ')
        {
            p++;
            
            length++;
        }
        
        //如果为空格
        else if(*p == ' ')
        {
            p++;
            //找出最长单词
            if(length > lengthMax)
            {
                lengthMax = length;
               
                save = p - length - 1; //这句是什么意思,没看懂??????
            }
            
            length = 0;//这句是什么意思,没看懂??????
        }
    }
    //输出最长单词
    printf("最长单词为:\n ");
   
    //从保存的最长单词输出
    for(int i = 0; i < lengthMax; i++)
    {
        printf("%c",*(save + i));//这句(save +i)是什么意思,没看懂??????
    }
   
   
    return  0;
}


2 个回复

倒序浏览
不知道我说明白没,希望可以帮到楼主。。。

  1. #include<stdio.h>
  2. int main()
  3. {
  4.     //定义一个已知的字符串
  5.     char a[] = "we need you and forever love you";
  6.    
  7.     //定义一个指针指向a的首元素
  8.     char *p = a;
  9.    
  10.     //定义一个指针来存放最长单词的首字母地址
  11.     char *save;
  12.    
  13.     //定义单词的长度,与最长单词的长度
  14.     int length = 0, lengthMax = 0;
  15.    
  16.     //循环遍历数组
  17.     //for(int i = 0; a != '\0'; i++)    //**********这里应该是a[i]
  18.     for(int i = 0; a[i] != '\0'; i++)
  19.     {
  20.         //如果不为空格就使p指向的地址+1
  21.         if(*p != ' ')
  22.         {
  23.             p++;
  24.             
  25.             length++;
  26.         }
  27.         
  28.         //如果为空格
  29.         else if(*p == ' ')
  30.         {
  31.             p++;
  32.             //找出最长单词
  33.             if(length > lengthMax)
  34.             {
  35.                 lengthMax = length;
  36.                
  37.                 save = p - length - 1; //这句是什么意思,没看懂??????
  38.     //*******************/意思是把最长单词的首字母的地址给保存起来,就是p现在指向的是最长单词的末尾,-length -1 就是把p现在的位置减去最长单词的长度,就指向最长单词的首字母了,-1是要多减一个,好比数组一样是从0开始的而不是从1开始的
  39.             }
  40.             
  41.             length = 0;//这句是什么意思,没看懂??????
  42.         //**********/意思是把当前单词的长度清空,重新计算下一个单词的长度与当前<最长>的单词进行比较
  43.         }
  44.     }
  45.     //输出最长单词
  46.     printf("最长单词为:\n ");
  47.    
  48.     //从保存的最长单词输出
  49.     for(int i = 0; i < lengthMax; i++)
  50.     {
  51.         printf("%c",*(save + i));//这句(save +i)是什么意思,没看懂??????
  52.         
  53.     //**************/意思是一个一个的取出最长单词的字母,因为save指向的是最长单词的首字母,所以要想完全输出,就要把地址一个一个往后移
  54.     }
  55.    
  56.    
  57.     return  0;
  58. }
复制代码
回复 使用道具 举报
本帖最后由 小月格子猫 于 2014-8-20 01:55 编辑

#include <stdio.h>
#include <string.h>
/**解题思路
*      1.》 定义一串字符,然后遍历
*       2.》定义一个变量保存,最长的长度
*        3.》定义一个指针保存,最长单词的结尾地址
*/ //     4.》获得这两个值之后,结尾地址的加一的地址减去字符长度得到,最长单词的的首地址,然后就好
//              输出了
int main()
{
    char array[] = "dgvcbncvvcvcbvn's hjghhjkgjhggjjh jhbkhjgh";
    //定义一个字符串
    long arrayLen =strlen(array);
    //计算出这个字符串的长度,以便于遍历字符串
    char *array1 = array;
    //定义一个指针,指向字符串的首地址
    int  arraylen = 0;
    //定义一个临时长度,以便于比较新保存的单词长度于已经保存的最长度哪个长
    int  Maxlen  = 0 ;
    //定义一个变量,保存最长长度
    char *saveArray = array1;
    //定义一个指针,保存最长单词的结尾地址
    for (int i = 0; i< arrayLen; i++)
    //遍历开始
    {
        if (*array1 != ' ')
        //if 语句判断 遍历的字符是否为空格,不为空格将执行语句
        {
            arraylen++;
          //临时长度加1
            if (i == arrayLen-1 && arraylen > Maxlen )
            //关于这个是我后来加上的,我不知道你发上来的代码是不是有bug,这个判断语句你可以最后看
            //因为还有种可能性,就是最后面的单词长怎么办,那个地方可能空格让你判断
            //所以我在这个地方加了一个判断语句
            {
              Maxlen  =  arraylen;
              array1++;
              saveArray = array1;
              continue;
            }
            
            array1++;
            //遍历的地址加1,以便于遍历下一个字符
        }
        //当它遍历很多次的时候,终于遍历到了空格,这个时候临时
        //单词长度已经保存了第一个单词长度
        
        
           else if (*array1 == ' ')
            {
                if(arraylen > Maxlen)
                //进入语句之后,我们先判断这个条件
                //最长的长度是否有临时长度长,在这里很显然没有,因为
                //前面我是将它初始化为0的,然后进入下面语句
                {
                    Maxlen  =  arraylen;
                    //于是我将这个临时的单词长度,赋予最长长度
                    //并将临时长度赋予0,以便于记录下个单词长度
                    arraylen = 0;
                    saveArray = array1;
                    //然后保存这个单词的结尾地址
                    array1++;
                    //同样的地址也要加哟,不然就没法顺利遍历下一个字符
                    continue;
                    //这些做完之后,就可以结束这次循环,进入下一次
                }
               
                arraylen = 0;
                //如果程序来到这里,证明所保存的最长长度比临时长度大
                //那么就没必要保存了,我们要将最长单词的长度赋予0
                //以便下次记录临时长度
                array1++;
                //同样的地址加1
               
            }
    }
   
    for (int i = 0; i<Maxlen; i++)
        //然后单词已经遍历结束,已经保存了单词最长长度的结尾地址和
        //单词的长度
    {
        printf("%c",*(saveArray-Maxlen+i));
    }                                  //然用结尾+1的地址-减去最长长度则为首地址,相当于第二十一个地址减去二十个地址就是第一个
    printf("\n");                   //然后第二位地址则是第一个地址加1
}

要是看不懂可以在问
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马