Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的简单句倒装句+;_C++ - Fatal编程技术网

C++ C+中的简单句倒装句+;

C++ C+中的简单句倒装句+;,c++,C++,我正试图建立一个程序来解决我最近买的一本教科书中的一个问题,这简直让我发疯 我必须构建一个句子反转器,以便得到以下结果: Input=“做或不做,没有尝试。” Output=“try.no不存在,do或do” 以下是到目前为止我得到的信息: void ReverseString::reversalOperation(char str[]) { char* buffer; int stringReadPos, wordReadPos, writePos = 0; // P

我正试图建立一个程序来解决我最近买的一本教科书中的一个问题,这简直让我发疯

我必须构建一个句子反转器,以便得到以下结果:

Input=“做或不做,没有尝试。” Output=“try.no不存在,do或do”

以下是到目前为止我得到的信息:

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 );
    }