C++ C+中的简单句倒装句+;
我正试图建立一个程序来解决我最近买的一本教科书中的一个问题,这简直让我发疯 我必须构建一个句子反转器,以便得到以下结果: Input=“做或不做,没有尝试。” Output=“try.no不存在,do或do” 以下是到目前为止我得到的信息:C++ C+中的简单句倒装句+;,c++,C++,我正试图建立一个程序来解决我最近买的一本教科书中的一个问题,这简直让我发疯 我必须构建一个句子反转器,以便得到以下结果: Input=“做或不做,没有尝试。” Output=“try.no不存在,do或do” 以下是到目前为止我得到的信息: void ReverseString::reversalOperation(char str[]) { char* buffer; int stringReadPos, wordReadPos, writePos = 0; // P
void ReverseString::reversalOperation(char str[]) {
char* buffer;
int stringReadPos, wordReadPos, writePos = 0;
// Position of the last character is length -1
stringReadPos = strlen(str) - 1;
buffer = new char[stringReadPos+1];
while (stringReadPos >= 0) {
if (str[stringReadPos] == ' ') {
wordReadPos = stringReadPos + 1;
buffer[writePos++] = str[stringReadPos--];
while (str[wordReadPos] != ' ') {
buffer[writePos] = str[wordReadPos];
writePos++;
wordReadPos++;
}
} else {
stringReadPos--;
}
}
cout << str << endl;
cout << buffer << endl;
}
void ReverseString::reversalooperation(char str[]){
字符*缓冲区;
int-stringReadPos,wordReadPos,writePos=0;
//最后一个字符的位置为长度-1
stringReadPos=strlen(str)-1;
缓冲区=新字符[stringReadPos+1];
而(stringReadPos>=0){
如果(str[stringReadPos]=''){
wordReadPos=stringReadPos+1;
缓冲区[writePos++]=str[stringReadPos--];
while(str[wordReadPos]!=“”){
缓冲区[writePos]=str[wordReadPos];
writePos++;
wordReadPos++;
}
}否则{
stringReadPos--;
}
}
cout因为您使用的是字符数组,所以可以使用C字符串库。如果您使用strtok,将更容易:
它需要使用指针,但会使您的生活更加轻松。您的分隔符将为“”。除非您感到受虐,否则请扔掉现有代码,从std::vector
和std::string
开始(最好是std::vector
)在代码< >代码>:代码拷贝> r> < r>代码> >代码> r> <代码>,你已经完成了很多工作。 这是非常简单的C++,在标准库的帮助下:
std::vector< std::string > sentence;
std::istringstream input( str );
// copy each word from input to sentence
std::copy(
(std::istream_iterator< std::string >( input )), std::istream_iterator< std::string >()
, std::back_inserter( sentence )
);
// print to cout sentence in reverse order, separated by space
std::copy(
sentence.rbegin(), sentence.rend()
, (std::ostream_iterator< std::string >( std::cout, " " ))
);
std::vector语句;
std::istringstream输入(str);
//将输入的每个单词复制到句子中
复制(
(std::istream_迭代器(输入)),std::istream_迭代器()
,std::back_插入器(句子)
);
//按相反顺序打印到cout语句,用空格分隔
复制(
语句.rbegin(),语句.rend()
,(std::ostream_迭代器(std::cout,“”)
);
我在您的代码中看到以下错误:
- 缓冲区的最后一个字符未设置为0(这将导致cout中出现故障)<
- 在内部循环中,您必须检查
str[wordReadPos]!=''&&str[wordReadPos]!=0
,否则在扫描第一个字时,它将永远找不到终止空间
对于科学的兴趣,我试图让你的代码工作得像是。是的,它不是真正的C++方式来做事情,但是有教育意义。
当然,这只是完成这项工作的一百万种方法中的一种。我将把它作为一个练习留给您,让您删除这段代码在输出中留下的尾随空间;)
我用“编辑”注释了我的更改
char*缓冲区;
int-stringReadPos,wordReadPos,writePos=0;
//最后一个字符的位置为长度-1
stringReadPos=strlen(str)-1;
缓冲区=新字符[stringReadPos+1];
而(stringReadPos>=0){
如果((str[stringReadPos]='')
||(stringReadPos==0))//编辑:需要检查是否命中字符串的开头
{
wordReadPos=stringReadPos+(stringReadPos?1:0);//编辑:如果我们碰到字符串的开头,不要跳过空格
//buffer[writePos++]=str[stringReadPos-->;//编辑:这只是为了获取空间,这里不需要
while((str[wordReadPos]!=“”)
&&(str[wordReadPos]!='\0')//编辑:需要检查是否碰到字符串的结尾
{
缓冲区[writePos]=str[wordReadPos];
writePos++;
wordReadPos++;
}
缓冲区[writePos++]='';//编辑:在单词后添加空格
}
stringReadPos--;//编辑:每次减少读取位置
}
缓冲区[writePos]='\0';//编辑:nul终止字符串
cout您的代码有哪些问题,还有哪些更为复杂的处理方法尚未编写好。不过,我想补充一点,方法论
- 编写实现算法的函数/程序
- 看看它是否有效
- 如果没有,请查看代码,直到找到问题所在
没有太多的效率。可以帮助您解决此问题以及将来的许多其他问题的是调试器(以及可怜人的调试器printf)这将使你能够看到你的程序实际上是如何在步骤中工作的,数据发生了什么。换句话说,你将能够看到它的哪个部分在你期望的情况下工作,并且行为不同。如果你在*nix上,不要犹豫去尝试GDB。 < P>这里是一个更为C++的版本。虽然我认为简单比STY更重要。基本算法很简单,先反转单词,然后反转整个字符串
<>你可以写C代码,它和C++版本一样明显。我认为编写不炫耀C++的代码是不正确的。
void word_reverse(std::string &val) {
size_t b = 0;
for (size_t i = 0; i < val.size(); i++) {
if (val[i] == ' ') {
std::reverse(&val[b], &val[b]+(i - b));
b = ++i;
}
}
std::reverse(&val[b], &val[b]+(val.size() - b));
std::reverse(&val[0], &val[0]+val.size());
}
TEST(basic) {
std::string o = "Do or do not, there is no try.";
std::string e = "try. no is there not, do or Do";
std::string a = o;
word_reverse(a);
CHECK_EQUAL( e , a );
}
void word_reverse(std::string&val){
尺寸b=0;
对于(size_t i=0;i
有一个多重的、超前的或后继的空间可能是退化的情况,这取决于你实际上想要它们的行为。
你是C++的,所以放弃所有的指针MalARKY!如果你坚持指针MalARKY,请修复内存泄漏!哎哟,你把我打败了。虽然有趣的练习。但是)你也应该为StReN + 1分配缓冲区,而不是只是strlen.@konrad.kruczynski,一个很好的观点。我假设+1的错误是添加了终结者。编辑:我没有修改它吗
void word_reverse(std::string &val) {
size_t b = 0;
for (size_t i = 0; i < val.size(); i++) {
if (val[i] == ' ') {
std::reverse(&val[b], &val[b]+(i - b));
b = ++i;
}
}
std::reverse(&val[b], &val[b]+(val.size() - b));
std::reverse(&val[0], &val[0]+val.size());
}
TEST(basic) {
std::string o = "Do or do not, there is no try.";
std::string e = "try. no is there not, do or Do";
std::string a = o;
word_reverse(a);
CHECK_EQUAL( e , a );
}