Perdón por la falta de claridad, el inglés es mi segundo idioma y algunas veces puede ser difícil especificar lo que necesito.

Tengo una tarea para escribir un programa c ++ donde: (1) Lee un archivo de texto y determina qué palabras son pares y cuáles son impares (2) Luego toma palabras pares e invierte el orden de los caracteres en cada palabra par.

Entonces, por ejemplo, tengo un texto de tamaño moderado. Selecciona palabras pares e invierte su orden de caracteres.

Hasta ahora he escrito este código y no sé si es bueno continuar porque no sé cómo invertir el orden de los caracteres. Gracias por la ayuda.

#include <iostream>
#include <string>
#include <string.h>
#include <cstdlib>
#include <fstream>
using namespace std;

int main()
{
    string word;
    ifstream f("text.txt");
    if (f.is_open())
    {
        while (f >> word)
        {
            if (word.length() % 2 == 0)
                cout << word << endl;
        }
        f.close();
    }
        else
            cout << "file is not open" << '\n';
    }
c++
0
Sidabras 27 abr. 2020 a las 18:44

2 respuestas

La mejor respuesta

Solo necesita agregar std::reverse a su código. También he revisado tu fragmento de código.

Su código se verá más o menos así después de eso:

#include <iostream>
#include <string>
// #include <string.h> -- no need of this header
#include <cstdlib> // not required at all for this code segment, maybe required in your actual code
#include <fstream>
#include <algorithm> // this is additional header that you need

using namespace std; // this is not a good practice though

int main()
{
    string word;
    ifstream f("text.txt"); // it is not recommended to use single letter variable names
    if (f.is_open()) // just keeping f instead of f.is_open() will work the same way
    {
        while (f >> word)
        {
            if (word.length() % 2 == 0)
                cout << reverse(word.begin(), word.end()) << endl; // using std::reverse here
        }
        f.close(); // not necessary statement but considered a good practice to prevent memory leaks and access locks.
    }
    else
        cout << "file is not open" << '\n'; // prefer using std::cerr instead of std::cout to log errors
                                            // and better error message will be "Unable to open text.txt!".
    return 0; // return something other than 0 in case of error
}
1
brc-dd 27 abr. 2020 a las 16:12

Si está buscando ser un poco aventurero, puede escribir su propia función de inversión de cadena simple utilizando un iterador hacia adelante y hacia atrás y simplemente intercambiando caracteres de ambos extremos de la reunión de cadena en el medio, p.

std::string& strrev (std::string& s)
{
    std::string::iterator i = s.begin();
    std::string::reverse_iterator j = s.rbegin();

    for (; &(*j) > &(*i); i++, j++) {
        unsigned char tmp = *i;
        *i = *j;
        *j = tmp;
    }

    return s;
}

Por supuesto, std::reverse() lo hace por usted, pero como señaló @john en los comentarios, la programación consiste en poder inventar código para resolver problemas.

0
David C. Rankin 27 abr. 2020 a las 16:42