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

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  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 2,939 veces)
S4ms3pi0l__

Desconectado Desconectado

Mensajes: 21


Ver Perfil
Problema al comparar cadenas de caracteres [C]
« 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.  


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

BloodSharp


Desconectado Desconectado

Mensajes: 804


El Messi-Vegeta :D


Ver Perfil
Re: Problema al comparar cadenas de caracteres [C]
« Respuesta #1 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#


En línea



S4ms3pi0l__

Desconectado Desconectado

Mensajes: 21


Ver Perfil
Re: Problema al comparar cadenas de caracteres [C]
« Respuesta #2 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
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Problema al comparar cadenas de caracteres [C]
« Respuesta #3 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.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
¿Comparar dos cadenas de caracteres en php?
PHP
Netstat89 5 10,866 Último mensaje 1 Octubre 2012, 21:21 pm
por Shell Root
Cadenas de caracteres. Función para comparar una cadena ignorando signos. C++
Programación C/C++
seryioo 1 3,683 Último mensaje 12 Agosto 2015, 13:50 pm
por ivancea96
[C] Problema con caracteres y cadenas « 1 2 »
Programación C/C++
n-utz 11 4,907 Último mensaje 23 Mayo 2016, 00:53 am
por n-utz
Ayudaa!!! comparar cadenas de caracteres
Programación C/C++
judithmateos 7 3,470 Último mensaje 18 Diciembre 2016, 03:59 am
por crack81
Problema con comparar cadenas
Programación C/C++
Jay 3 2,409 Último mensaje 29 Abril 2021, 11:03 am
por MAFUS
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines