我是新手程序员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;
}
答案 0 :(得分:9)
您的代码比必要的复杂得多,因为您没有将问题分解为更容易解决的较小任务。
基本上有三个步骤:
这些任务中的每一项在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
课程,那么您的第一步应该是编写课程。它不一定是花哨的,但它至少应该处理处理字符串内存,读取输入和写入输出的基本机制。