简体   繁体   English

以相反的顺序打印输入的字符串词

[英]Printing input string words in reverse order

Using if and while / do - while , my job is to print following user's inputs (string value) in reverse order. 使用if and while / do - while ,我的工作是按照相反的顺序打印以下用户的输入(字符串值)。

For example: 例如:

input string value : "You are American" output in reverse order : "American are You" 输入字符串值:“您是美国人”,输出顺序相反:“美国人是您”

Is there any way to do this? 有什么办法吗?

I have tried 我努力了

string a;
cout << "enter a string: ";
getline(cin, a);
a = string ( a.rbegin(), a.rend() );
cout << a << endl;
return 0;

...but this would reverse the order of the words and spelling while spelling is not what I'm going for. ...但是这会颠倒单词拼写的顺序,而拼写不是我想要的。

I also should be adding in if and while statements but do not have a clue how. 我还应该添加ifwhile语句,但是不知道如何。

The algorithm is: 该算法是:

  1. Reverse the whole string 反转整个字符串
  2. Reverse the individual words 反转单个单词
#include<iostream>
#include<algorithm>
using namespace std;

string reverseWords(string a)
{ 
    reverse(a.begin(), a.end());
    int s = 0;
    int i = 0;
    while(i < a.length())
    {
        if(a[i] == ' ')
        {
             reverse(a.begin() + s, a.begin() + i);
             s = i + 1;
        }
        i++;
    }
    if(a[a.length() - 1] != ' ')  
    {
        reverse(a.begin() + s, a.end());           
    }
    return a; 
}

Here is a C-based approach that will compile with a C++ compiler, which uses the stack to minimize creation of char * strings. 这是一种基于C的方法,它将与C ++编译器一起编译,该编译器使用堆栈来最大程度地减少char *字符串的创建。 With minimal work, this can be adapted to use C++ classes, as well as trivially replacing the various for loops with a do-while or while block. 只需最少的工作,就可以适应使用C ++类,并用do-whilewhile块轻松替换各种for循环。

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

#define MAX_LINE_LENGTH 1000
#define MAX_WORD_LENGTH 80

void rev(char *str) 
{
    size_t str_length = strlen(str);
    int str_idx;
    char word_buffer[MAX_WORD_LENGTH] = {0};
    int word_buffer_idx = 0;

    for (str_idx = str_length - 1; str_idx >= 0; str_idx--)
        word_buffer[word_buffer_idx++] = str[str_idx];

    memcpy(str, word_buffer, word_buffer_idx);
    str[word_buffer_idx] = '\0';
}

int main(int argc, char **argv) 
{
    char *line = NULL;
    size_t line_length;
    int line_idx;
    char word_buffer[MAX_WORD_LENGTH] = {0};
    int word_buffer_idx;

    /* set up line buffer - we cast the result of malloc() because we're using C++ */

    line = (char *) malloc (MAX_LINE_LENGTH + 1);
    if (!line) {
        fprintf(stderr, "ERROR: Could not allocate space for line buffer!\n");
        return EXIT_FAILURE;
    }

    /* read in a line of characters from standard input */

    getline(&line, &line_length, stdin);

    /* replace newline with NUL character to correctly terminate 'line' */

    for (line_idx = 0; line_idx < (int) line_length; line_idx++) {
        if (line[line_idx] == '\n') {
            line[line_idx] = '\0';
            line_length = line_idx; 
            break;
        }
    }

    /* put the reverse of a word into a buffer, else print the reverse of the word buffer if we encounter a space */

    for (line_idx = line_length - 1, word_buffer_idx = 0; line_idx >= -1; line_idx--) {
        if (line_idx == -1) 
            word_buffer[word_buffer_idx] = '\0', rev(word_buffer), fprintf(stdout, "%s\n", word_buffer);
        else if (line[line_idx] == ' ')
            word_buffer[word_buffer_idx] = '\0', rev(word_buffer), fprintf(stdout, "%s ", word_buffer), word_buffer_idx = 0;
        else
            word_buffer[word_buffer_idx++] = line[line_idx];
    }

    /* cleanup memory, to avoid leaks */

    free(line);

    return EXIT_SUCCESS;
}

To compile with a C++ compiler, and then use: 要使用C ++编译器进行编译,然后使用:

$ g++ -Wall test.c -o test
$ ./test
foo bar baz
baz bar foo

This example unpacks the input string one word at a time, and builds an output string by concatenating in reverse order. 本示例一次将输入字符串解压缩一个单词,并通过以相反的顺序串联来构建输出字符串。 ` `

#include <iostream>
#include <sstream>

using namespace std;

int main()
{
  string inp_str("I am British");
  string out_str("");
  string word_str;
  istringstream iss( inp_str );


  while (iss >> word_str) {
    out_str = word_str + " " + out_str;
  } // while (my_iss >> my_word) 

  cout << out_str << endl;

  return 0;
} // main

` `

You might try this solution in getting a vector of string 's using the ' ' (single space) character as a delimiter. 您可以尝试这种解决方案中得到一个vectorstring '使用S'(单个空格)字符作为分隔符。

The next step would be to iterate over this vector backwards to generate the reverse string. 下一步将是向后迭代此向量以生成反向字符串。

Here's what it might look like ( split is the string splitting function from that post): 看起来像这样( split是该文章中的字符串拆分功能):

Edit 2 : If you don't like vector s for whatever reason, you can use arrays (note that pointers can act as arrays). 编辑2 :如果出于某种原因不喜欢vector ,则可以使用数组(请注意,指针可以充当数组)。 This example allocates a fixed size array on the heap, you may want to change this to say, double the size when the current word amount has reached a certain value. 本示例在堆上分配了一个固定大小的数组,您可能需要更改为,例如,当当前单词数量达到某个值时,将大小增加一倍。

Solution using an array instead of a vector : 使用array而不是vector解决方案:

#include <iostream>
#include <string>
using namespace std;

int getWords(string input, string ** output)
{
    *output = new string[256];  // Assumes there will be a max of 256 words (can make this more dynamic if you want)
    string currentWord;
    int currentWordIndex = 0;
    for(int i = 0; i <= input.length(); i++)
    {
        if(i == input.length() || input[i] == ' ')  // We've found a space, so we've reached a new word
        {
            if(currentWord.length() > 0)
            {
                (*output)[currentWordIndex] = currentWord;
                currentWordIndex++;
            }
            currentWord.clear();
        }
        else
        {
            currentWord.push_back(input[i]);    // Add this character to the current word
        }
    }
    return currentWordIndex;    // returns the number of words
}

int main ()
{
    std::string original, reverse;
    std::getline(std::cin, original);  // Get the input string
    string * arrWords;
    int size = getWords(original, &arrWords);  // pass in the address of the arrWords array
    int index = size - 1;
    while(index >= 0)
    {
       reverse.append(arrWords[index]);
       reverse.append(" ");
       index--;
    }
    std::cout << reverse << std::endl;
    return 0;
}

Edit : Added includes, main function, while loop format 编辑 :添加包括, main功能, while循环格式

#include <vector>
#include <string>
#include <iostream>
#include <sstream>


// From the post
std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems)
{
   std::stringstream ss(s);
   std::string item;
   while(std::getline(ss, item, delim)) {
       elems.push_back(item);
   }
   return elems;
}


std::vector<std::string> split(const std::string &s, char delim) {
    std::vector<std::string> elems;
    return split(s, delim, elems);
}

int main ()
{
    std::string original, reverse;
    std::cout << "Input a string: " << std::endl;
    std::getline(std::cin, original);  // Get the input string

    std::vector<std::string> words = split(original, ' ');

    std::vector<std::string>::reverse_iterator rit = words.rbegin();

    while(rit != words.rend())
    {
       reverse.append(*rit);
       reverse.append(" "); // add a space
       rit++;
    }
    std::cout << reverse << std::endl;
    return 0;
}

This uses exactly one each of if and while . ifwhile分别使用一个。

#include <string>
#include <iostream>
#include <sstream>


void backwards(std::istream& in, std::ostream& out)
{
   std::string word;
   if (in >> word)   // Read the frontmost word
   {
      backwards(in, out);  // Output the rest of the input backwards...
      out << word << " ";  // ... and output the frontmost word at the back
   }
}

int main()
{
   std::string line;
   while (getline(std::cin, line))
   {
      std::istringstream input(line);
      backwards(input, std::cout);
      std::cout << std::endl;
   }
}

This code here uses string libraries to detect the blanks in the input stream and rewrite the output sentence accordingly 此处的代码使用字符串库来检测输入流中的空格,并相应地重写输出语句

The algorithm is 1. Get the input stream using getline function to capture the spacecs. 算法为1.使用getline函数获取输入流以捕获空格。 Initialize pos1 to zero. 将pos1初始化为零。 2. Look for the first space in the input stream 3. If no space is found, the input stream is the output 4. Else, get the position of the first blank after pos1, ie pos2. 2.查找输入流中的第一个空格。3.如果找不到空间,则输入流为输出4.否则,获取pos1之后的第一个空格的位置,即pos2。 5. Save the sub-string bewteen pos1 and pos2 at the beginning of the output sentence; 5.将子字符串pos1和pos2之间的子字符串保存在输出语句的开头; newSentence. new句子。 6. Pos1 is now at the first char after the blank. 6. Pos1现在位于空格之后的第一个字符。 7. Repeat 4, 5 and 6 untill no spaces left. 7.重复4、5和6,直到没有剩余空间。 8. Add the last sub-string to at the beginning of the newSentence. 8.将最后一个子字符串添加到newSentence的开头。

#include <iostream> 
#include <string> 

  using namespace std; 

int main ()
{ 
    string sentence; 
    string newSentence;
    string::size_type pos1; 
    string::size_type pos2; 

    string::size_type len; 

    cout << "This sentence rewrites a sentence backward word by word\n"
            "Hello world => world Hello"<<endl;

    getline(cin, sentence); 
    pos1 = 0; 
    len = sentence.length();
    pos2 = sentence.find(' ',pos1); 
    while (pos2 != string::npos)
        {
            newSentence = sentence.substr(pos1, pos2-pos1+1) + newSentence; 
            pos1 = pos2 + 1;
            pos2 = sentence.find(' ',pos1);       
        }
    newSentence = sentence.substr(pos1, len-pos1+1) + " "  + newSentence;
    cout << endl << newSentence  <<endl; 

    return 0;

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM