根据单词长度对句子进行排序

时间:2011-02-19 16:46:20

标签: c++

我是新手程序员C / C ++。学习指针和角色指针,并试图解决运动问题。问题陈述

给出一句“世界是一个生活的好地方”

问题描述:根据字长的升序重新排列给定句子

输出应该是“A是生活世界的好地方”

我正在尽我所能并且粘贴我编写的代码,但无法得出答案。有人可以指出错误。我相信有很多。

#include <iostream>    
#include <string.h>

using namespace std;
char* breakIntoWords(char *,char*pt);

    int getwordcount(char* p)
    {
     int wc = 0;

     while(*p == ' ')
      {
         p++;
      }
      while( 1) {

      while( *p != ' ' && *p != '\0' && *p !='\n')
      { 
        p++;

      }
    if(*p ==  ' ')
    {
       p++;
    }
    else{
       break;
    }


      wc++;
      }
    wc++;
      return wc;

    }

    int main()
    {

       char bsentence[120][5];
       char sentence[120];
        cout<<"Ent&er STring"<<endl;
        char *p ;
        p = "Test it again and welcome";
        strcpy(sentence, p);
        int wordcount =0;
        wordcount=getwordcount(sentence);
        char *pt = sentence;
        for(int i =0; i <wordcount; i++)
        {

         pt = breakIntoWords(pt,bsentence[i]);
        }



           for(int i =0; i< wordcount; i++)
        {
          for(int j=i; j<i;  j++)
           {
              int one = strlen(bsentence[i]);
              int two = strlen(bsentence[i+1]);

            if(one > two)
               {
                   char temp[120];
                   strcpy(temp,bsentence[i]);
                   strcpy(bsentence[i+1],temp);


           }

            }

        }
    char sen2[12];
     for(int i=0; i<wordcount; i++)
      {

          strcat(sen2,bsentence[i++]);
          strcat(sen2, " ");
       }
       strcpy(sentence,sen2);




        cout<<sentence;

    }
    char* breakIntoWords(char*p, char*pt)
    {
       int i =  0, j = 0;
      while( *p != ' ')
      {
       pt[i] = *p++;
       i++;

      }
      p++;
      pt[i]='\0';

      return p;
    }

不使用String类。

我终于解决了。任何有关改进它的意见都是值得欢迎的。

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

#define MAX_WORD_SIZE 30
#define MAX_LINE_SIZE 100
using namespace std;

int getWordCount(char* s)
{
   int wc = 0;
   while(*s == ' ')
     s++;
   while(*s != '\n')
   {
      while(*s != ' ' && *s != '\n')
      {
         s++;
       }

       if(*s == ' ')
       {
         while(*s == ' ')
            s++;
       }
       wc++;
   }
   return wc;
}
char* getWord(char* Source, char* word)
{
     while(*Source == ' ')
         Source++;
      int i =0;
      while(*Source != ' ' && *Source != '\n')
      {
         word[i] = *Source;
         Source++;i++;
       }
       word[i]='\0';
       if(*Source == ' ')
       {
         while(*Source == ' ')
            Source++;
       }
       return Source;


}
void sortSentence(char* p[], int wc)
{
   char *temp = new char[MAX_WORD_SIZE];
   for(int i =0; i<wc; i++)
   {
      for(int j = i; j< (wc-1); j++)
       {
           if(strlen(p[j]) > strlen(p[j+1]))
            {
                strcpy(temp,p[j]);
                strcpy(p[j],p[j+1]);
                strcpy(p[j+1],temp); 
             }
        }
    }
    delete[] temp;
}
int main()
{

 char* string;
 string = new char[MAX_LINE_SIZE];
 cout<<"Enter Sentence"<<endl;
 fgets(string,MAX_LINE_SIZE,stdin);
 int wordCount = getWordCount(string);
 char* pArrayOfPointers[30];
 char* tempString = string;
 for(int i =0; i< wordCount; i++)
 {
    char *ptemp;
      ptemp =new char[MAX_WORD_SIZE];
    pArrayOfPointers[i]= ptemp;
    tempString = getWord(tempString,pArrayOfPointers[i]);
    cout<<pArrayOfPointers[i]<<endl;          
  }
  sortSentence(pArrayOfPointers, wordCount);

  strcpy(string,pArrayOfPointers[0]);
  strcat(string," ");
  for(int i =1; i< wordCount; i++)
  {
     strcat(string,pArrayOfPointers[i]);
     strcat(string," ");

   }
   cout<<string;
 delete[] string;


}

1 个答案:

答案 0 :(得分:9)

您的代码比必要的复杂得多,因为您没有将问题分解为更容易解决的较小任务。

基本上有三个步骤:

  1. 将句子分解为一系列单词。
  2. 按长度排列单词数组。
  3. 输出字,以空格分隔。
  4. 这些任务中的每一项在C ++中都是微不足道的,并且不需要指针或任何类似的东西(这是好的事物。指针在C中占有一席之地,但在C ++中很少见。)

    例如,第一步可以使用C ++ IO流和vector容器来解决:

    std::vector<std::string> words;
    
    std::string word;
    while (cin >> word)
        words.push_back(word);
    

    这将从标准输入中读取单个单词并将其存储在向量中。

    第二步 使用C ++标准库sort函数解决。

    第三步只是迭代向量并将单词推送到cout流。

    总而言之,这不应超过15行代码。

    如果您不想使用string课程,那么您的第一步应该是编写课程。它不一定是花哨的,但它至少应该处理处理字符串内存,读取输入和写入输出的基本机制。