elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Como leer una cadena de caracteres vacia
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Como leer una cadena de caracteres vacia  (Leído 2,736 veces)
josueroddy

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Como leer una cadena de caracteres vacia
« 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


En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Como leer una cadena de caracteres vacia
« Respuesta #1 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


En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problemas leer cadena de caracteres con conio
Programación C/C++
powerflame 1 3,084 Último mensaje 23 Mayo 2011, 20:52 pm
por Khronos14
Si variable PHP vacia(no empty(),is_null,isset) que no tome 0 como vacia en POST
PHP
Graphixx 9 22,753 Último mensaje 12 Mayo 2012, 18:58 pm
por it3r
Leer Cadena de Caracteres
ASM
muyayodeoz 1 2,514 Último mensaje 10 Enero 2014, 16:25 pm
por muyayodeoz
Como devolver puntero con cadena vacia
Programación C/C++
Destro- 6 3,843 Último mensaje 17 Marzo 2014, 22:30 pm
por Eternal Idol
[Pregunta]: Cadena vacia (PHP)
Desarrollo Web
Leguim 2 2,013 Último mensaje 14 Abril 2019, 02:41 am
por Leguim
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines