Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: S4ms3pi0l__ en 27 Noviembre 2017, 02:58 am



Título: Problema al comparar cadenas de caracteres [C]
Publicado por: S4ms3pi0l__ en 27 Noviembre 2017, 02:58 am
Tengo este problema al comparar cadenas de caracteres. A la hora de buscar un código previamente ingresado en el arreglo, este imprime el mensaje "No existe" cuando únicamente ingreso uno de los códigos. Ejemplo:
Código ingresado en el segundo arreglo: cp020
Búsqueda: No Existe
'Nombre del producto'
No existe
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4. #include <string.h>
  5.  
  6. void menu(){
  7. printf("\t*****CONTROL DE INVENTARIO*****\n");
  8. printf("1.-Listado del inventario actual\n2.-Busqueda de productos\n3.-Ingresos totales\n4.-SALIR\n");
  9. printf("--------------------------------\n");
  10. }
  11.  
  12. void salida(){
  13. printf("Saliendo del programa... Hasta pronto!\n");
  14. }
  15. struct Inventario{
  16. char codigo[10];
  17. char nombre[25];
  18. int cantidad;
  19. float pventa;
  20. };
  21. int Registrar(Inventario x[], int i){
  22. for(i=0;i<=2;i++){
  23. printf("\tRegistrar productos\n");
  24. printf("Producto #%d \n",i);
  25. printf("Ingrese el codigo del producto: ");
  26. gets(x[i].codigo);
  27. fflush(stdin);
  28. printf("\nIngrese el nombre del producto: ");
  29. gets(x[i].nombre);
  30. fflush(stdin);
  31. do{
  32. printf("\nIngrese la cantidad: ");
  33. scanf("%d",&x[i].cantidad);
  34. fflush(stdin);
  35. }while(x[i].cantidad<=0);
  36. do{
  37. printf("\nIngrese el precio de venta: ");
  38. scanf("%f",&x[i].pventa);
  39. fflush(stdin); //Limpieza del buffer
  40. }while(x[i].pventa<=0);
  41. system("cls");
  42. }
  43. }
  44. void Lista(int i, Inventario x[]){
  45. for(int j=0;j<=2;j++){
  46. printf("   %s    %s        %d      %0.2f \n",x[j].codigo, x[j].nombre, x[j].cantidad, x[j].pventa);
  47. }
  48. }
  49. char Busqueda(Inventario x[], int i){
  50. char cod[10];
  51. printf("Ingrese el codigo que desea buscar: ");
  52. scanf("%s",&cod);
  53. fflush(stdin);
  54. for(int j=0;j<=2;j++){
  55. if(strcmp(x[j].codigo, cod)==0){
  56. printf("\nProducto: %s \n",x[j].nombre);
  57. break;
  58. }else{
  59. printf("\nNo Existe\n");
  60. break;
  61. }
  62. }
  63. }
  64. float Venta(Inventario x[], int i){
  65. float total;
  66. for(int j=0;j<=2;j++){
  67. total+=x[j].cantidad*x[j].pventa;  //Primero, multiplica la cantidad por el precio y al final, se suma para el total del inventario vendedido.
  68. }
  69. printf("Ingreso total: %0.2f $ \n",total);
  70. }
  71. int main(){
  72. struct Inventario prod[20];
  73. int i=0, op;
  74. bool salir = true;
  75. Registrar(prod,i); //Llamamos a la funcion "Registrar"
  76. do{
  77. system("cls");
  78. menu(); //Llamamos a la funcion "Menu"
  79. do{
  80. printf("\nSeleccione una opcion: ");
  81. scanf("%d",&op);
  82. }while(op<=0 || op>=5);
  83. system("cls");
  84. switch(op){
  85. case 1:{
  86. printf("\tINVENTARIO ACTUAL\n");
  87. printf("   Codigo    Producto        Cantidad      Precio de Venta\n");
  88. Lista(i,prod);
  89. system("PAUSE");
  90. system("cls");
  91. break;
  92. }
  93. case 2:{
  94. printf("\tBUSQUEDA\n");
  95. Busqueda(prod, i);
  96. fflush(stdin);
  97. system("PAUSE");
  98. system("cls");
  99. break;
  100. }
  101. case 3:{
  102. printf("\tVENTA TOTAL DEL INVENTARIO\n");
  103. Venta(prod, i);
  104. system("PAUSE");
  105. system("cls");
  106. break;
  107. }
  108. case 4:{
  109. salida();
  110. salir = false;
  111. break;
  112. }
  113. }
  114. }while(salir==true);
  115. return 0;
  116. }
  117.  


Título: Re: Problema al comparar cadenas de caracteres [C]
Publicado por: BloodSharp en 27 Noviembre 2017, 04:40 am
Código
  1. int Registrar(Inventario x[], int i){
  2. (...)
  3. printf("\nIngrese el nombre del producto: ");
  4. gets(x[i].nombre);
  5. fflush(stdin);
  6. (...)
  7. }
  8.  
  9. char Busqueda(Inventario x[], int i){
  10. char cod[10];
  11. printf("Ingrese el codigo que desea buscar: ");
  12. scanf("%s",&cod);
  13. fflush(stdin);
  14. (...)
  15. }

Primero te recomendaría que elijas solo para ingresar strings scanf+fflush o gets, si mal no recuerdo fflush no era necesario con gets, pero por otra parte estás en el scanf asignando mal la dirección de memoria del string cod, si ya de por sí es un puntero/array/etc... no hace falta asignarle el símbolo ampersand para especificarle dirección de memoria porque de por sí lo toma como dirección de memoria. En todo caso al asignarle ampersand al vector estarías especificandole que dentro de los valores basura que tiene cod dicho valor sea dirección de memoria, por lo tanto estaría guardandose el valor en cualquier lado y no en el vector real...
El hecho que no haya crasheado el programa con eso sería raro habría que depurarlo para ver bién donde quedó guardado realmente el código ingresado...


B#


Título: Re: Problema al comparar cadenas de caracteres [C]
Publicado por: S4ms3pi0l__ en 27 Noviembre 2017, 16:45 pm
Primero te recomendaría que elijas solo para ingresar strings scanf+fflush o gets, si mal no recuerdo fflush no era necesario con gets, pero por otra parte estás en el scanf asignando mal la dirección de memoria del string cod, si ya de por sí es un puntero/array/etc... no hace falta asignarle el símbolo ampersand para especificarle dirección de memoria porque de por sí lo toma como dirección de memoria. En todo caso al asignarle ampersand al vector estarías especificandole que dentro de los valores basura que tiene cod dicho valor sea dirección de memoria, por lo tanto estaría guardandose el valor en cualquier lado y no en el vector real...
El hecho que no haya crasheado el programa con eso sería raro habría que depurarlo para ver bién donde quedó guardado realmente el código ingresado...


B#
El problema no está en el registro, el problema está en la búsqueda, porque si corres el programa en tu entorno, podrás observar que, al ingresar un código previamente ingresado y compararlo, el programa además de mostrar el nombre del producto al que le pertenece el código, también imprime otros dos mensajes del else


Título: Re: Problema al comparar cadenas de caracteres [C]
Publicado por: MAFUS en 27 Noviembre 2017, 20:00 pm
Aparte del error con el scanf que te han marcado, el uso de gets (no recomendado y que se ha eliminado en las últimas versiones de C) y el uso de fflush en stdin (la función solo sirve para flujos de salida, en los de entrada no está especificado su funcionamiento) el error que tienes en Busqueda es que no realizas una búsqueda en el array, solo miras el primer elemento.

Sigue el flujo del programa.
Entras en un for para recorrer el array y el if busca si existe el dato. Si lo encuentra devuelve el nombre y sale del for. Bien.
La cosa viene cuando no encuentra el dato: directamente, sin tener en cuenta el resto del array, indica que no ha encontrado el producto y el break hace que salga del for, sin existir posibilidad de buscar en el resto del array.

Por tanto te falta algo para, en caso de que no se encuentre pase al siguiente elemento del array y diga que no hay existencias en caso de no encontrarse.

Por cierto, te iría bien separar la búsqueda de la presentación de resultados, verás que la lógica para llegar a la solución es más clara: es decir, por una parte buscas en el array y si encuentras el elemento marcas como que lo has encontrado y detienes la búsqueda pero si no lo has encontrado indicas que no ha habido éxito. Después según el resultado lanzas un mensaje u otro.