Dev - C++ - Separar dígitos (numéticos) de caracteres en una cadena

 
Vista:

Separar dígitos (numéticos) de caracteres en una cadena

Publicado por Iret (4 intervenciones) el 06/12/2020 00:01:10
Tengo una cadena de caracteres que tiene dígitos: '1' '2' '3' ... '9' y letras mayusculas y minusculas. Necesito guardar todos los numeros (convirtiéndolos de char a int) en una variable int n que aparezcan antes de un caracter dado, y ese caracter guardarlo en una variable c.

Ej. 85xxx -> en n guardaría 85 y en c guardaría x.

No me funciona este código que he escrito porque trata a los caracteres letras como si fuesen dígitos y los guarda en n.

¿Me puede ayudar?

Muchas gracias!!

CÓDIGO:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void leeNumeroYCaracter(char cadena[],char &c, int &n){
    if (cadena[0]=='\0'){
            n=0;
            c='\0';
        }
    else{
        for (int i=0;cadena[i]!='\0'&&c=='\0';i++){
            if ('1'<=cadena[i]<='9'){
                n=n*10+((cadena[i]-48)%10);
            }
            else if ('A'<=cadena[i]<='Z'||'a'<=cadena[i]<='z'){
                c=cadena[i];
            }
        }
    }
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alfil
Val: 4.344
Oro
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Separar dígitos (numéticos) de caracteres en una cadena

Publicado por Alfil (1444 intervenciones) el 06/12/2020 17:55:24
No tengo claro como piensas almacenar todos los números en una variable int y todas las letras en un char, quizá deberías almacenarlo en un arreglo.

Te pongo este código d ejemplo para detectar números en un arreglo char.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
using namespace std;
 
int main()
{
    char c[] = {'E', 'l', ' ', 'n', 'u', 'm', 'r', 'r', 'o', ' ', '1', '3'};
    int sz = sizeof c / sizeof* c;
    int n;
 
    for (int i = 0; i < sz; i++)
    {
        if (int(c[i]) >= 48 && int(c[i]) <= 57)
        {
            n = int(c[i]) - 48;
            cout << n << " ";
        }
    }
 
    return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Separar dígitos (numéticos) de caracteres en una cadena

Publicado por Iret (4 intervenciones) el 06/12/2020 18:29:43
Vale, a ver, es que cuando escribí la pregunta no tenía las ideas claras para el algoritmo principal.

Realmente, el array siempre va a ser de la forma dígito numérico+carácter (sucesivamente). Por ejemplo: 0a0b1b2a.
La idea es guardar sólo el primer numero (int n=0) y el carácter que le sigue (char c=a ).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Alfil
Val: 4.344
Oro
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Separar dígitos (numéticos) de caracteres en una cadena

Publicado por Alfil (1444 intervenciones) el 06/12/2020 19:21:05
¿Y el resto de números y caracteres?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Separar dígitos (numéticos) de caracteres en una cadena

Publicado por Iret (4 intervenciones) el 06/12/2020 20:34:07
La idea es guardar la n y c obtenidas en un struct que tiene array de caracteres y array de enteros.
Luego volver a implementar y guardar los siguientes valores de n y c.
Me estoy dando cuenta de que en el fondo es hacer el arreglo que me comentabas al princpio...

Osea si me puedes ayudar en como guardar esa cadena en un:

1
2
3
4
struct diccionario {
           struct palabra pal [100];
           int npal;
}
Donde:
1
2
3
4
struct palabra {
          int numero;
          char letra;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Alfil
Val: 4.344
Oro
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Separar dígitos (numéticos) de caracteres en una cadena

Publicado por Alfil (1444 intervenciones) el 06/12/2020 21:05:02
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
 
using namespace std;
 
struct Palabra
{
    char c;
    int n;
};
 
int main()
{
    int szc = 8, szp = 4;
    Palabra p[szp];
    char c[] = {'0', 'a', '1', 'a', '0', 'b', '1', 'b'};
 
    int i = 0, k = 0;
    while (i < szc)
    {
        if (int(c[i]) >= 48 && int(c[i]) <= 57)
            p[k].n = int(c[i++]) - 48;;
        if (int(c[i]) < 48 || int(c[i]) > 57)
            p[k].c = c[i++];
 
        k++;
    }
 
    cout << "\nNumeros: ";
    for (int i = 0; i < 4; i++)
        cout << p[i].n << " ";
 
    cout << "\nLetras ";
    for (int i = 0; i < 4; i++)
        cout << p[i].c << " ";
 
    cout << endl;
 
    return 0;
 
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Separar dígitos (numéticos) de caracteres en una cadena

Publicado por Iret (4 intervenciones) el 06/12/2020 21:28:16
Vale genial, con eso a ver si se me ocurre algo...

No se si es mucho molestar, es que soy principiante en esto y tengo que hacer un algoritmo de descompresión dada una cadena comprimida con el algoritmo LZ78. El algoritmo de compresión lo he conseguido, pero el de descompresión se me resiste...

El de compresión me ha quedado así:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
#include <cstring>
#include <math.h>
#include <stdio.h>
using namespace std;
 
void compresion(char cadena[100],char res[100],int dicc[][2]){
    char*cursor=cadena,indcad;
    int npal=1,inddicc=0,indres=0;
    while(*cursor!='\0'){
        indcad=48+inddicc;
        int x=0;
        if(*cursor=='b')x=1;
        if(dicc[inddicc][x]==0){
            cout <<inddicc<<*cursor;
            for(indres;indres<2*npal;indres++){
                if(indres%2==0)
                    res[indres]=indcad;
                else
                    res[indres]=*cursor;
            }
            dicc[inddicc][x]=npal;
            ++npal;
            ++cursor;
            inddicc=0;
        }
        else{
            inddicc=dicc[inddicc][x];
            ++cursor;
        }
    }
    if (inddicc!=0){
        cout <<inddicc<<endl;
        res[indres]=inddicc+48;
    }
}
int main(){
    const int MAX_PAL=15;
    char cadena[100],res[100];
    int dicc[MAX_PAL][2]={};
    cin >>cadena;
    compresion(cadena,res,dicc);
}

Si se te ocurre algo para descomprimir... Me sirve con que funcione para cadenas de aes y bes.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar