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


 


Tema destacado: Página de elhacker.net en Google+ Google+


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  Problema al comparar cadenas de caracteres [C]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema al comparar cadenas de caracteres [C]  (Leído 379 veces)
S4ms3pi0l__

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Problema al comparar cadenas de caracteres [C]
« en: 27 Noviembre 2017, 02:58 »

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.  


« Última modificación: 27 Noviembre 2017, 04:07 por S4ms3pi0l__ » En línea

BloodSharp

Desconectado Desconectado

Mensajes: 261


Crianosfera 4 in comming!!!


Ver Perfil
Re: Problema al comparar cadenas de caracteres [C]
« Respuesta #1 en: 27 Noviembre 2017, 04:40 »

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#


En línea

S4ms3pi0l__

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Re: Problema al comparar cadenas de caracteres [C]
« Respuesta #2 en: 27 Noviembre 2017, 16:45 »

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
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.000



Ver Perfil
Re: Problema al comparar cadenas de caracteres [C]
« Respuesta #3 en: 27 Noviembre 2017, 20:00 »

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.
En línea

while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines