Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: josueroddy en 19 Octubre 2021, 23:24 pm



Título: Como leer una cadena de caracteres vacia
Publicado por: josueroddy en 19 Octubre 2021, 23:24 pm
Buenas amigos del foro, no estoy seguro si el titulo de mi pregunta es correcta pero procedo a explicar
Soy nuevo en la programación y me mandaron un proyecto de hacer un inventario en C con un limite de 10 artículos, ya tengo hecho una parte, mi problema surge cuando quiero ver el inventario, el programa si lee las opciones ingresadas por el usuario, pero si solo ingreso un elemento, al momento de ver el inventario aparece ese elemento pero también sale los otros que aun no se les ha asignado valor representados con caracteres aleatorios
Quisiera saber si hay una manera de condicionar la cadena a que no muestre nada si el usuario no lo ha escrito

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4.  
  5. int main(){
  6.    int p, j;
  7.    int producto[10];
  8. char items [10] [100];
  9. float precio[10];
  10. int cantidad [10];
  11. int opc, mostrar=0, id=0;
  12.  
  13.  
  14. j=10;
  15.  
  16. do{
  17. for (p=0;p<j;p++){
  18.  
  19. printf("Bienvenido al inventario\n");
  20. printf("Escoga de las siguientes opciones\n");
  21. printf("1. Crear elemento\n2. Eliminar elemento\n3. Modificar elemento\n4. Ver inventario\n5. Cerrar\n");
  22. scanf("%d", &opc);
  23.  
  24. switch(opc){
  25.  
  26. case 1:
  27. system("cls");
  28. printf("Inserte nombre del producto %d\n", p+1, producto[p]);
  29. scanf("%s", &items[p]);
  30.  
  31. printf("Inserte precio del producto %d\n", p+1, producto[p]);
  32. scanf("%f", &precio[p]);
  33. printf("Inserte la cantidad del producto %d\n", p+1, producto[p]);
  34. scanf("%d", &cantidad[p]);
  35.  
  36. printf("¿Desea ir al menu?\n1. Si\n2. No\n");
  37. scanf("%d", &opc);
  38.  
  39. switch (opc){
  40. case 1:
  41. system("cls");
  42. mostrar=0;
  43.  
  44. break;
  45.  
  46. case 2:
  47. system("cls");
  48. printf("Gracias por usar nuestro programa\n");
  49. mostrar=1;
  50.  
  51. return 0;
  52.  
  53. break;
  54.  
  55. default:
  56. system("cls");
  57. printf("No existe esta opcion");
  58. mostrar=1;
  59.  
  60. return 0;
  61. break;
  62.  
  63. }
  64.  
  65. break;
  66.  
  67. case 4:
  68.  
  69. for (p=0;p<j;p++){
  70.  
  71. memset(items, 0, 100);
  72.  
  73.  
  74. printf("%d.\t%s\t%.2f\t%d\t\n",p+1, items[p], precio[p], cantidad[p]);
  75.  
  76.  
  77. mostrar=0;
  78.  
  79. }
  80.  
  81. break;
  82.  
  83. }
  84.  
  85. }
  86.  
  87. }while (mostrar==0);
  88.  
  89. return 0;
  90. }
  91.  

Puse solo el case 1 y case 4 para verificar como estaba funcionando por si acaso
Cualquier sugerencia sera bien recibida, gracias


Título: Re: Como leer una cadena de caracteres vacia
Publicado por: K-YreX en 23 Octubre 2021, 00:41 am
La respuesta a este problema es sencilla: tener una variable que almacene siempre el número de elementos insertados.
Cuando se tiene una colección de datos (array o similares) hay dos conceptos parecidos pero diferentes: size y capacity.
  • size -> Indica el número de elementos que contiene la colección
  • capacity -> Indica el máximo número de elementos que puede contener la colección

Es un problema común cuando se recorre una colección, utilizar la condición (i < capacity) en vez de (i < size). En tu caso concreto parece que la variable j corresponde a capacity y la variable p corresponde a size (excepto cuando haces p=0 al mostrar). Corrige eso un poco y lo tendrás (usa siempre que puedas nombres descriptivos, esto no es necesario para los contadores de un for: i, j, k...; pero sí siempre que esas variables las uses para más cosas)

PD: No le encuentro sentido a la función memset() que utilizas.

Por otro lado te dejo algunos consejos extra:
  • Las cadenas de caracteres se recomienda leerlas con fgets() en vez de scanf(). En este foro hay muchos temas al respecto, puedes utilizar el botón de "Buscar" para encontrarlos.
  • Utiliza constantes para los valores predefinidos y evita siempre que sea posible escribir números directamente en el código. Así será más fácil entender por qué hay un 10 por ahí y no es un 15 por ejemplo.
Código
  1. const int MAX_ELEMENTOS = 10;
  2. const int MAX_LONGITUD_ELEMENTO = 100;
  3.  
  4. int main() {
  5.    ...
  6. }
Así si en un momento dado quieres cambiar alguno de esos valores, sólo tendrás que cambiarlo en un sitio y no en todas las líneas donde lo usas.

Se puede mejorar alguna cosa más pero con esos dos puntos creo que ya se notará una mejora considerable.
Suerte  :-X