¿Cómo puedo contar los caracteres del alfabeto español? C++

publicado por: Anonymous

Estoy buscando una forma de contar los caracteres de una palabra, frase o texto en español.

Por ejemplo:

cout << "Cantidad de letras: " << letters_counted( "¿Hola, cómo estás?" ) << endl;

El resultado debería ser:

Cantidad de letras: 13

No estoy encontrando la forma de comparar letras con tildes, ¿hay alguna forma?


Este es un intento que me falló:

int count=0; txt="Hola, cómo estás";

regex rx( "[a-zA-ZñÑáéíóúÁÉÍÓÚ]" );

for( sregex_iterator it( txt.cbegin(), txt.cend(), rx ); it!=sregex_iterator();
  ++it ) count++;
cout << count << endl;

En vez de mostrar 13, que es la cantidad de letras que hay, me devuelve 15.

No entiendo cómo tratar a los caracteres extendidos, como las vocales con tilde, á, é, í, ó, ú y la ñ.


Este es otro intento, el algoritmo es similar al de @AngelAngel.

int letters_counted_in_text( std::string const&text ) {
  count = 0
  string abc = "abcdefghijklmnñopqrstuvwxyzáéíóú"
      "ABCDEFGHIJKLMNÑOPQRSTUVWXYZÁÉÍÓÚ";
  for( unsigned i=0; i<text.length(); ++i )
    for( unsigned j=0; j<abc.length(); ++j )
      if( text.at( i )==abc.at( j ) )
      {
        count++;
        j=abc.length();
      }
  return count;
}

Pero también me retorna 15 letras cuando debería ser 13, al ejemplo “Hola, cómo estás“.

¿Hay posibilidad de usar u16string o wstring? Para tratar las letras del alfabeto español.

solución

he visto que modifico su pregunta borrare mi respuesta anterior, dejare algunas aclaraciones sobre porque esos codigos funcionaban


Bien al lio que seguro tiene prisa.

De su pregunta:

Este es un intento que me falló:

int count=0; txt="Hola, cómo estás";
regex rx( "[a-zA-ZñÑáéíóúÁÉÍÓÚ]" );
for( sregex_iterator it( txt.cbegin(), txt.cend(), rx ); it!=sregex_iterator();
  ++it ) count++;
cout << count << endl;

En vez de mostrar 13, que es la cantidad de letras que hay, me
devuelve 15.

#include <iostream>
#include <regex>

using namespace std;

int main() {
    // your code goes here
    int count=0; 

    wstring txt = L"Hola, cómo estás";

wregex rx( L"[a-zA-ZñÑáéíóúÁÉÍÓÚ]" );

for( wsregex_iterator it( txt.cbegin(), txt.cend(), rx ); it!=wsregex_iterator();
  ++it ) count++;
cout << count << endl;
    return 0;
}

testideone

cambios:

  • string por wstring y añadimos L:

    wstring txt = L"Hola, cómo estás";

  • regex por wregex y añadimos L:

    wregex rx( L"[a-zA-ZñÑáéíóúÁÉÍÓÚ]" );

  • sregex_iterator por wsregex_iterator

    for( wsregex_iterator...

  • sregex_iterator(); por wsregex_iterator();

    it!=wsregex_iterator();


De su pregunta:

Este es otro intento, el algoritmo es similar al de @AngelAngel.

int letters_counted_in_text( std::string const&text ) {
  count = 0
  string abc = "abcdefghijklmnñopqrstuvwxyzáéíóú"
      "ABCDEFGHIJKLMNÑOPQRSTUVWXYZÁÉÍÓÚ";
  for( unsigned i=0; i<text.length(); ++i )
    for( unsigned j=0; j<abc.length(); ++j )
      if( text.at( i )==abc.at( j ) )
      {
        count++;
        j=abc.length();
      }
  return count;
}
int letters_counted_in_text(std::wstring const&text)
{
    int count = 0;
    wstring abc = L"abcdefghijklmnñopqrstuvwxyzáéíóúABCDEFGHIJKLMNÑOPQRSTUVWXYZÁÉÍÓÚ";

    for (unsigned i = 0; i < text.length(); ++i)
        for (unsigned j = 0; j < abc.length(); ++j)
            if (text.at(i) == abc.at(j))
            {
                count++;
                j = abc.length();
            }
    return count;
}

cambios:

  • std::string const&text por std::wstring const&text

.

int letters_counted_in_text(std::wstring const&text)
  • string por wstring y añadimos L:

.

wstring abc = L"abcdefghijklmnñopqrstuvwxyzáéíóúABCDEFGHIJKLMNÑOPQRSTUVWXYZÁÉÍÓÚ";

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *