如何在C ++中反转给定的句子(字符串)?

时间:2010-11-23 21:56:07

标签: c++ arrays string variable-assignment

示例:如果输入是DOGS LIKE CATS 输出 - CATS LIKE DOGS

考虑到我必须只使用:If-else条件,而& for循环,数组,字符串和函数。不是字符串函数,指针和&动态内存分配&结构。 空格也需要与示例相同。

我尝试做以下事情,但它不起作用,你可以帮忙吗?

void revSent(char str[]){
char temp[100];
int k;
for (i=sentenceSize ; i>0 ; i--)
    for (k=0 ; k<sentenceSize ; k++)
        temp[k]=str[i];

for (k=0 ; k<sentenceSize ; k++)
    if (temp[k]!=' ')
        for (i=k ; i>0 ; i--)
            printf("%c", temp[i]);

}

6 个答案:

答案 0 :(得分:9)

这很容易就地完成,没有任何额外的数据结构:

  1. 反转整个字符串:DOGS LIKE CATS - &gt; STAC EKIL SGOD

  2. 反转字符串中的每个字:STAC EKIL SGOD - &gt; CATS LIKE DOGS

  3. 提示:您可以对(1)和(2)使用相同的功能。

答案 1 :(得分:5)

您可以实施以下内容以获得解决方案:

  1. 将句子分成单词列表。
  2. 反转此列表。
  3. 将此列表一起形成句子。

答案 2 :(得分:3)

如果您将单词定义为以空格分隔的标记,则以下内容将执行:

std::vector<std::string> sentence;
std::copy(std::istream_iterator<std::string>(std::cin),
          std::istream_iterator<std::string>(),
          std::back_inserter(sentence));
std::reverse(sentence.begin(), sentence.end());

从本质上讲,您希望从单词的定义开始,然后将单词放在容器中,最后使用std::reverse()来反转它们。

对于算法作业,教师可能不会对此感到满意。您想要创建一个将句子拆分为单词的函数。当然,您可以使用相同字符串中的指针 - 这可能是您的教师的意图,但如果这不是您必须的,那么我个人觉得更容易使用容器。

答案 3 :(得分:2)

我会给出一个提示:由于你不能使用数据结构,你不能直接使用Paul或OJ的方法。但是,递归函数调用会形成一个堆栈。

答案 4 :(得分:0)

  • 将句子分解为单词
  • 按顺序将每个单词推入堆栈
  • 将每个项目从堆栈中弹出并打印出/添加到列表/写入文件/无论如何。

瞧!

答案 5 :(得分:0)

谁说STL没用?

根据您的操作方式,有不同的方法可以解决此问题。

我的方式就是:

while (original_string isn't empty){    
   take first word  
   prepend to reversed string
}

这是C ++解决方案(使用findsubstr,两个非常有用的字符串函数)

    using namespace std;
string word_reverse(string original){
    string reverse_string;
    if (original.find(' ')!=string::npos){
        do{
            int pos=original.find(' ');
            //prepend word
            reverse_string=original.substr(0,pos)+' '+reverse_string;
            //remove word from original,considering the found whitespace
            original=original.substr(pos+1,original.length()-(pos+1));
        }while(original.find(' ')!=string::npos);
        //don't forget the last word!
        return original+' '+reverse_string;
    }
    else{//no whitespace: return original text
        return original;
    }
}