Autor Tema: ¿Cómo determinar que un string tenga una cadena valida?  (Leído 4133 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
¿Cómo determinar que un string tenga una cadena valida?
« en: 28 de Octubre de 2022, 13:19:42 »
Hola

Tengo un arreglo de tipo char (String) en C de la siguiente manera:

Código: C
  1. #define MaximoStringEnJson 50
  2. ....
  3. char ClienteRazonSocial[MaximoStringEnJson];

Este arreglo se "llena" con información desde un servidor remoto, y existe la posibilidad que tenga un valor de nulo o espacio(s) en blanco(s)

Para determinar si es nulo, se puede hacer algo así:

Código: C
  1. if (0x00 == ClienteRazonSocial[0x00])
  2. {
  3.    //arreglo es nulo
  4. }
  5. {
  6.    //arreglo no es nulo
  7. }


Pero puede que tenga un número indeterminado de espacios en blanco (obviamente máximo 50), es decir, por ejemplo, puede contener "        "

, pero por si tiene algo así "    A    " sería algo válido.

Algo que se me ocurre, es que una vez que se verifique que no es nulo, es retirar todos los caracteres 'espacio en blanco' y verificar si tiene caracteres válidos, pero tal vez existe una mejor manera de hacerlo.


¿Alguna sugerencia o comentario?

Gracias

« Última modificación: 28 de Octubre de 2022, 15:23:55 por DominusDRR »
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:¿Cómo determinar que un string tenga una cadena valida?
« Respuesta #1 en: 28 de Octubre de 2022, 15:06:32 »
¿Por qué lo estás programando en C?

Yo creo que lo mejor es eliminar los espacios en blanco y después determinar si los caracteres son válidos.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:¿Cómo determinar que un string tenga una cadena valida?
« Respuesta #2 en: 28 de Octubre de 2022, 15:22:37 »
¿Por qué lo estás programando en C?
Porque es la herramienta de programación del microcontrolador que utilizo en un producto (XC32)

Yo creo que lo mejor es eliminar los espacios en blanco y después determinar si los caracteres son válidos.

Puede ser una buena idea
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:¿Cómo determinar que un string tenga una cadena valida?
« Respuesta #3 en: 28 de Octubre de 2022, 16:22:56 »
¿Por qué lo estás programando en C?
Porque es la herramienta de programación del microcontrolador que utilizo en un producto (XC32)

Yo creo que lo mejor es eliminar los espacios en blanco y después determinar si los caracteres son válidos.

Puede ser una buena idea

Podría ser algo así aproximadamente:

Código: C
  1. bool EsCadenaValida(char *p)
  2. {
  3.     unsigned char i = 0x00;
  4.     do
  5.     {
  6.         if(false == isspace(*p))
  7.         {
  8.             return true; //Encuentra al menos un caracter que no es espacio
  9.         }
  10.         i++;
  11.         p++;
  12.     }while(i < MaximoStringEnJson)
  13.     return false; // Todos los caracteres son espacio
  14. }
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:¿Cómo determinar que un string tenga una cadena valida?
« Respuesta #4 en: 28 de Octubre de 2022, 16:50:21 »
No entiendo cual es tu objetivo...

En C. Un string es valido siempre y cuando tenga un carácter nulo.
Si llegaste hasta la cantidad MaximoStringEnJson - 1 y no tenes un carácter nulo, entonces es una string invalido, ya sea porque el string pasado es mas largo o a propósito.

Luego según tu variable: MaximoStringEnJson puedo llegar a entender que lo que buscas es que el string este en un formato valido de JSON.
Esto:
Código: [Seleccionar]
{"hola":"como"
                                                   }
Es un JSON valido. Y de nada serviría eliminar o contar los demás caracteres.

Tal vez lo que estas buscando un PARSER de JSON.. Ej:
https://github.com/forkachild/C-Simple-JSON-Parser
https://github.com/zserge/jsmn
« Última modificación: 28 de Octubre de 2022, 22:22:22 por KILLERJC »

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:¿Cómo determinar que un string tenga una cadena valida?
« Respuesta #5 en: 28 de Octubre de 2022, 17:00:15 »
No entiendo cual es tu objetivo...

En C. Un string es valido siempre y cuando tenga un carácter nulo.
Si llegaste hasta la cantidad MaximoStringEnJson - 1 y no tenes un carácter nulo, entonces es una string invalido, ya sea porque el string pasado es mas largo o a propósito.

Luego según tu variable: MaximoStringEnJson puedo llegar a entender que lo que buscas es que el string este en un formato valido de JSON.
Esto:
Código: [Seleccionar]
{"hola":"como"
                                                   }
Es un JSON valido. Y de nada serviría eliminar o contar los demás caracteres.

Tal vez lo que estas buscando un PARSER de JSON.. Ej:
https://github.com/forkachild/C-Simple-JSON-Parser
https://github.com/zserge/jsmn

Creo que eres un prejuicioso, el hecho que tenga esto:

Código: C
  1. #define MaximoStringEnJson 50

Hizo que asumieras muchas cosas

¿Qué tal si hubiera sido así?

Código: C
  1. #define Maximo 50

Retornando al asunto, ClienteRazonSocial puede contener un nombre, pero dicho nombre debe al menos tener una letra, si solo son espacios en blanco o es nulo, debe informarse al usuario que no puede tener ese tipo de nombre y ese es mi objetivo



« Última modificación: 28 de Octubre de 2022, 17:05:05 por DominusDRR »
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:¿Cómo determinar que un string tenga una cadena valida?
« Respuesta #6 en: 28 de Octubre de 2022, 18:03:07 »
No es prejuicioso, es sacar conclusiones con lo poca información entregada. Ya que no tengo la menor idea, ni logro entender, porque un servidor externo te enviaría mensajes nulos, en blanco, o con información perdida en espacios en blanco. Y estaria buscando el problema en ese servidor y no en el programa que buscas hacer. A no ser que no tengas acceso al servidor.

Citar
Retornando al asunto, ClienteRazonSocial puede contener un nombre, pero dicho nombre debe al menos tener una letra, si solo son espacios en blanco o es nulo, debe informarse al usuario que no puede tener ese tipo de nombre y ese es mi objetivo

Entonces si es para lo planteado (son puros espacios en blancos o es nulo) podrías revisar si tenes aunque sea una letra, ya que es lo único que interesa:

Código: C
  1. valido = false;
  2. for (i=0; i< sizeof ClienteRazonSocial && ClienteRazonSocial[i] != '\0';i++) {
  3.    if(isalpha(ClienteRazonSocial[i])) {
  4.       valido = true;
  5.       break;
  6.    }
  7. }

Citar
Este arreglo se "llena" con información desde un servidor remoto, existe la posibilidad que tenga un valor de nulo o espacio(s) en blanco(s)
es retirar todos los caracteres 'espacio en blanco' y verificar si tiene caracteres válidos

Supongamos lo siguiente "JoseCarreras", " J o seCarr eras" y "Jose Carreras" al eliminar los espacios en blanco quedan iguales. Y son caracteres validos. ¿Seria correcto asumir que son lo mismo?
Es mas sencillo solamente revisar que todos los caracteres sean los que se esperan, y rechazar cualquier otra cosa.
La otra opción es comparar revisar lo que llega y tratarlo como un todo, solo revisas por un nulo, lo cual se resuelve en un !(*ClienteRazonSocial) como planteaste
Además como dije, no se que servidor es, pero debería enviar solo cuando posee algo correcto y bien formateado.
« Última modificación: 28 de Octubre de 2022, 18:06:24 por KILLERJC »

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:¿Cómo determinar que un string tenga una cadena valida?
« Respuesta #7 en: 28 de Octubre de 2022, 18:18:23 »
No es prejuicioso, es sacar conclusiones con lo poca información entregada. Ya que no tengo la menor idea, ni logro entender, porque un servidor externo te enviaría mensajes nulos, en blanco, o con información perdida en espacios en blanco. Y estaría buscando el problema en ese servidor y no en el programa que buscas hacer. A no ser que no tengas acceso al servidor.

Creo que la información entregada era suficiente, respecto a lo que quería hacer. Haber mencionado por ahí la palabra JSON y servidor, hizo que pienses mucho para una pregunta sencilla.

Nunca mencioné que tenía problemas con deserializar o serializar un JSON (eso es prueba superada hace mucho tiempo)  ;-)

Respecto a porque están en "  ", es información que se ingreso hace mucho tiempo de manera manual, y ese dato en particular fue dejado en blanco (con uno varios espacios en blanco) y en este momento que tenemos un hardware que obtiene esa información, se puede aprovechar para que el usuario complete la información faltante, eso era todo.

Gracias por la sugerencia, puede ser útil. Pensaba que tal vez se podría hacer en menos líneas, pero creo que de esa manera o como yo la propuse se debe hacer.

Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado AnitaMalhereux

  • PIC10
  • *
  • Mensajes: 42
Re:¿Cómo determinar que un string tenga una cadena valida?
« Respuesta #8 en: 28 de Octubre de 2022, 18:37:14 »
No es prejuicioso, es sacar conclusiones con lo poca información entregada. Ya que no tengo la menor idea, ni logro entender, porque un servidor externo te enviaría mensajes nulos, en blanco, o con información perdida en espacios en blanco. Y estaría buscando el problema en ese servidor y no en el programa que buscas hacer. A no ser que no tengas acceso al servidor.

Creo que la información entregada era suficiente, respecto a lo que quería hacer. Haber mencionado por ahí la palabra JSON y servidor, hizo que pienses mucho para una pregunta sencilla.

Nunca mencioné que tenía problemas con deserializar o serializar un JSON (eso es prueba superada hace mucho tiempo)  ;-)

Respecto a porque están en "  ", es información que se ingreso hace mucho tiempo de manera manual, y ese dato en particular fue dejado en blanco (con uno varios espacios en blanco) y en este momento que tenemos un hardware que obtiene esa información, se puede aprovechar para que el usuario complete la información faltante, eso era todo.

Gracias por la sugerencia, puede ser útil. Pensaba que tal vez se podría hacer en menos líneas, pero creo que de esa manera o como yo la propuse se debe hacer.

El problema es que hay gente se pone analizar todo y sacan las conclusiones sin pensar demasiado, otra cosa hubiera sido si preguntaba de manera sutil si era algún problema con deserializar un JSON en lugar de sacar conclusiones y dar respuestas a dichas afirmaciones.

A veces hay que aparentar ser "novato" ya que pasan cosas como estás.

Por ejemplo hubieras dicho, estoy haciendo un programa en C, donde el usuario ingresa una palabra con el teclado y dicha frase guardo en un array similar a este.
Si el texto ingresado es sólo son caracteres en blanco, por ejemplo ingreso "    ", debe advertirse al usuario que dicho texto es incorrecto, si al menso tiene una letra, es válido.

Te van a tomar como alguien que recién está aprendiendo C y esta haciendo sólo ejemplo sencillos y no van a irse por la tangente con la respuesta.




Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:¿Cómo determinar que un string tenga una cadena valida?
« Respuesta #9 en: 28 de Octubre de 2022, 18:45:26 »

A veces hay que aparentar ser "novato" ya que pasan cosas como estás.

Por ejemplo hubieras dicho, estoy haciendo un programa en C, donde el usuario ingresa una palabra con el teclado y dicha frase guardo en un array similar a este.
Si el texto ingresado es sólo son caracteres en blanco, por ejemplo ingreso "    ", debe advertirse al usuario que dicho texto es incorrecto, si al menso tiene una letra, es válido.

Te van a tomar como alguien que recién está aprendiendo C y esta haciendo sólo ejemplo sencillos y no van a irse por la tangente con la respuesta.

No creo que eso pase.

Si lo hubiera preguntado al estilo "novato"

Seguramente me hubieran preguntado

  • ]¿Pero para que quieres hacer eso?
  • Seguramente el problema es en la manera que estás capturando los datos desde el teclado.

  • ¿Cómo piensas informar al usuario?

Etc etc en lugar de ir directamente a una solución del problema
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:¿Cómo determinar que un string tenga una cadena valida?
« Respuesta #10 en: 28 de Octubre de 2022, 21:21:37 »
El problema es que hay gente se pone analizar todo y sacan las conclusiones sin pensar demasiado, otra cosa hubiera sido si preguntaba de manera sutil si era algún problema con deserializar un JSON en lugar de sacar conclusiones y dar respuestas a dichas afirmaciones.

Es justamente lo contrario, estoy dando la información a medida que recibo los datos,
Si el titulo pregunta cuando una cadena es valida, ¿Por qué no seria valida?,
Si luego se indica que a veces podes recibir espacios en blancos o string nulos ¿Por qué no puedo suponer que sean otros caracteres cuando mas adelante dice que va a checkear por caracteres validos?
Si pones una variable que dice JSON, en un string, ¿Por qué no puedo suponer que se trata de un JSON en el string y si esta mal formateado?, especialmente cuando se nombró un servidor y JSON es una forma valida para intercambiar datos.
Si podes tener 50 caracteres blancos en un máximo de 50 lugares, ¿Por que no puedo suponer que el string esta mal hecho a propósito?


Mira que rápido salió cuando escribió:

Citar
Retornando al asunto, ClienteRazonSocial puede contener un nombre, pero dicho nombre debe al menos tener una letra, si solo son espacios en blanco o es nulo, debe informarse al usuario que no puede tener ese tipo de nombre y ese es mi objetivo

Donde se entregó claramente las condiciones, 1 letra se considera valido, lo demás no. FIN.
Digamos ahora que la Razón Social no puede tener menos de 3 letras, sino se busca que el usuario ingrese la info... ¿Es correcto el código entregado?¿Es correcta la solución de borrar los espacios en blanco y checkear caracteres validos?. Obviamente que no. Y si tenes una persona que no tiene ni idea de programación, vas a pasar 10 repuestas para que luego entregue otro dato, y replantees todo para que luego de otras 10 mensajes de ida y vuelta entregue otro dato que te va a cambiar todo.

La persona a la que le planteas el problema no tiene ni idea lo que hiciste, lo que tenes, y mucho menos si te planteaste todas las situaciones posibles, por lo que si no esta escrito mi deber es planteárme estas dudas para dar una respuesta. Esto es un foro y no un chat, por lo que tampoco puede estar generando una pregunta a cada momento. Supuse lo del JSON. Respondió que no es eso. Listo sigamos con otra cosa. Luego de contestar surgió otra duda:

Citar
Supongamos lo siguiente "JoseCarreras", " J o seCarr eras" y "Jose Carreras" al eliminar los espacios en blanco quedan iguales. Y son caracteres validos. ¿Seria correcto asumir que son lo mismo?

¿Por que surge esta duda?, Esta duda surge por lo de "eliminar los espacios en blancos" propuesto, ¿Qué ganas eliminando los espacios en blancos?, si pensas modificar la razón social entonces mi pregunta es sensata, si es solamente para determinar si luego los otros caracteres son validos, entonces no tiene sentido... Solamente ignorar los espacios en blanco y haces una sola pasada por el array.

Tal ves no quiero que se me escape nada, y si se tomaron a mal la respuesta quiero que sepan que nunca lo hice ni de forma burlona ni por cualquier otra idea mala, simplemente tratando de ayudar.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:¿Cómo determinar que un string tenga una cadena valida?
« Respuesta #11 en: 28 de Octubre de 2022, 22:00:06 »
Si el titulo pregunta cuando una cadena es valida, ¿Por qué no seria valida?,

Estoy de acuerdo con el título podría no ser el adecuado, pero para eso está la descripción del problema.

Se explicó lo que sucedía y que una cadena de esta manera "    " era algo que se debía detectar, pero una cadena con al menos un carácter diferente de espacio era algo válido (Por ejemplo  "    A    ").

Eso era todo.

En cuestiones técnicas, suponer (que los has escrito varias veces) puede ser posible, pero la respuesta inicial no fue suposición, fue afirmación.





« Última modificación: 28 de Octubre de 2022, 22:04:27 por DominusDRR »
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:¿Cómo determinar que un string tenga una cadena valida?
« Respuesta #12 en: 28 de Octubre de 2022, 22:23:25 »
Mi sincera afirmacion:
Citar
No entiendo cual es tu objetivo...

Respuesta al titulo:
Citar
En C. Un string es valido siempre y cuando tenga un carácter nulo.
Si llegaste hasta la cantidad MaximoStringEnJson - 1 y no tenes un carácter nulo, entonces es una string invalido, ya sea porque el string pasado es mas largo o a propósito.

Citar
Luego según tu variable: MaximoStringEnJson puedo llegar a entender que lo que buscas es que el string este en un formato valido de JSON.
Esto:
Codigo de ejemplo
Es un JSON valido. Y de nada serviría eliminar o contar los demás caracteres.

Tal vez lo que estas buscando un PARSER de JSON.. Ej:

No veo afirmaciones acá. "Puedo llegar a entender" como "creo que buscas esto, no se" por eso Tal vez..


En fin.. Ya fue...

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:¿Cómo determinar que un string tenga una cadena valida?
« Respuesta #13 en: 28 de Octubre de 2022, 22:37:15 »
Mi sincera afirmacion:
Citar
No entiendo cual es tu objetivo...

Respuesta al titulo:
Citar
En C. Un string es valido siempre y cuando tenga un carácter nulo.
Si llegaste hasta la cantidad MaximoStringEnJson - 1 y no tenes un carácter nulo, entonces es una string invalido, ya sea porque el string pasado es mas largo o a propósito.

Citar
Luego según tu variable: MaximoStringEnJson puedo llegar a entender que lo que buscas es que el string este en un formato valido de JSON.
Esto:
Codigo de ejemplo
Es un JSON valido. Y de nada serviría eliminar o contar los demás caracteres.

Tal vez lo que estas buscando un PARSER de JSON.. Ej:

No veo afirmaciones acá. "Puedo llegar a entender" como "creo que buscas esto, no se" por eso Tal vez..


En fin.. Ya fue...

Explicación del problema

Cita de: c
Pero puede que tenga un número indeterminado de espacios en blanco (obviamente máximo 50), es decir, por ejemplo, puede contener "        "

, pero por si tiene algo así "    A    " sería algo válido.

Respuesta plausible, pero ligeramente alejada del tema, pero es comprensible

Cita de: c
En C. Un string es valido siempre y cuando tenga un carácter nulo.
Si llegaste hasta la cantidad MaximoStringEnJson - 1 y no tenes un carácter nulo, entonces es una string invalido, ya sea porque el string pasado es mas largo o a propósito.

Afirmación (respuesta fuera de lugar) ¿Quién menciono acerca de formatos válidos de un JSON? (WTF)  :shock:

Cita de: c
Luego según tu variable: MaximoStringEnJson puedo llegar a entender que lo que buscas es que el string este en un formato valido de JSON.
Es un JSON valido. Y de nada serviría eliminar o contar los demás caracteres.

Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado AnitaMalhereux

  • PIC10
  • *
  • Mensajes: 42
Re:¿Cómo determinar que un string tenga una cadena valida?
« Respuesta #14 en: 28 de Octubre de 2022, 22:40:59 »
Cambiando de coles a nabos, mencionaste que ya desrealizaste un JSON en C

Tengo unas preguntas

¿Puedes compartir o explicar el código?

¿Por qué haces eso con un microcontrolador? Es decir, tal vez debías usar un protocolo más simple para enviar y recibir datos desde un servidor remoto.